diff --git a/NEWS b/NEWS index 8ce253ee..f2810755 100644 --- a/NEWS +++ b/NEWS @@ -12,6 +12,7 @@ Enhancements and new features: * Add authprovider for cassandra export (thanks to @EmilienMottet) #1395 * Curses's browser server list sorting added (thanks to @limfreee) #1396 * ElasticSearch: add date to index, unbreak object push (thanks to @genevera) # 1438 + * Performance issue with large folder #1491 Bugs corrected: diff --git a/conf/glances.conf b/conf/glances.conf index 1a6880e1..a161be41 100644 --- a/conf/glances.conf +++ b/conf/glances.conf @@ -174,10 +174,12 @@ critical=90 # * careful: optional careful threshold (in MB) # * warning: optional warning threshold (in MB) # * critical: optional critical threshold (in MB) +# * refresh: interval in second between two refreshs #folder_1_path=/tmp #folder_1_careful=2500 #folder_1_warning=3000 #folder_1_critical=3500 +#folder_1_refresh=60 #folder_2_path=/home/nicolargo/Videos #folder_2_warning=17000 #folder_2_critical=20000 diff --git a/docs/aoa/folders.rst b/docs/aoa/folders.rst index af42efe3..08db2d5c 100644 --- a/docs/aoa/folders.rst +++ b/docs/aoa/folders.rst @@ -17,11 +17,12 @@ Each item is defined by: - ``careful``: optional careful threshold (in MB) - ``warning``: optional warning threshold (in MB) - ``critical``: optional critical threshold (in MB) +- ``refresh``: interval in second between two refresh (default is 30 seconds) Up to ``10`` items can be defined. -For example, if you want to monitor the ``/tmp`` folder, the following -definition should do the job: +For example, if you want to monitor the ``/tmp`` folder every minute, +the following definition should do the job: .. code-block:: ini @@ -30,8 +31,10 @@ definition should do the job: folder_1_careful=2500 folder_1_warning=3000 folder_1_critical=3500 + folder_1_refresh=60 In client/server mode, the list is defined on the ``server`` side. .. warning:: - Do **NOT** define folders containing lot of files and subfolders. + Do **NOT** define folders containing lot of files and subfolders or use an + huge refresh time... diff --git a/docs/man/glances.1 b/docs/man/glances.1 index 19980e64..8131c409 100644 --- a/docs/man/glances.1 +++ b/docs/man/glances.1 @@ -1,6 +1,6 @@ .\" Man page generated from reStructuredText. . -.TH "GLANCES" "1" "Apr 18, 2019" "3.1.1b0" "Glances" +.TH "GLANCES" "1" "Jun 12, 2019" "3.1.1b0" "Glances" .SH NAME glances \- An eye on your system . diff --git a/glances/folder_list.py b/glances/folder_list.py index cbd5df15..262e7610 100644 --- a/glances/folder_list.py +++ b/glances/folder_list.py @@ -22,6 +22,7 @@ from __future__ import unicode_literals import os +from glances.timer import Timer from glances.compat import range, nativestr from glances.logger import logger @@ -57,11 +58,19 @@ class FolderList(object): __folder_list_max_size = 10 # The folder list __folder_list = [] + # Default refresh time is 30 seconds for this plugins + __default_refresh = 30 def __init__(self, config): """Init the folder list from the configuration file, if it exists.""" self.config = config + # A list of Timer + # One timer per folder + # default timer is __default_refresh, can be overwrite by folder_1_refresh=600 + self.timer_folders = [] + self.first_grab = True + if self.config is not None and self.config.has_section('folders'): if scandir_tag: # Process monitoring list @@ -90,6 +99,12 @@ class FolderList(object): value['path'] = nativestr(value['path']) # Optional conf keys + # Refresh time + value['refresh'] = int(self.config.get_value(section, + key + 'refresh', + default=self.__default_refresh)) + self.timer_folders.append(Timer(value['refresh'])) + # Thesholds for i in ['careful', 'warning', 'critical']: # Read threshold value[i] = self.config.get_value(section, key + i) @@ -155,6 +170,9 @@ class FolderList(object): # Iter upon the folder list for i in range(len(self.get())): # Update folder size + if not self.first_grab and not self.timer_folders[i].finished(): + continue + # Get folder size try: self.__folder_list[i]['size'] = self.__folder_size(self.path(i)) except OSError as e: @@ -164,6 +182,11 @@ class FolderList(object): self.__folder_list[i]['size'] = '!' else: self.__folder_list[i]['size'] = '?' + # Reset the timer + self.timer_folders[i].reset() + + # It is no more the first time... + self.first_grab = False return self.__folder_list