summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornicolargo <nicolas@nicolargo.com>2018-01-16 22:29:36 +0100
committernicolargo <nicolas@nicolargo.com>2018-01-16 22:29:36 +0100
commit141999bb684bf068edc327ebb2bbe9505c5fa8af (patch)
tree63a88604a575e44b943aa3ab3780eb150fb92c0f
parent53992ff41d0ae38d2236bc3706c473dd24083113 (diff)
parent43aeb4f2e7bffc92d67e4135f9b1cbad946c5c42 (diff)
Merge branch 'issue1105' into develop
-rw-r--r--NEWS1
-rw-r--r--glances/plugins/glances_processlist.py9
-rw-r--r--glances/processes.py64
-rw-r--r--requirements.txt2
4 files changed, 72 insertions, 4 deletions
diff --git a/NEWS b/NEWS
index d566617c..9d9fc8df 100644
--- a/NEWS
+++ b/NEWS
@@ -17,6 +17,7 @@ Enhancements and new features:
* Remove graph export from Glances #1206
* Add a code of conduct for Glances project's participants #1211
* Context switches bottleneck identification #1212
+ * Take advantage of the PSUtil issue #1025 (Add process_iter(attrs, ad_value)) #1105
Bugs corrected:
diff --git a/glances/plugins/glances_processlist.py b/glances/plugins/glances_processlist.py
index 12d8a72c..e27ab6dd 100644
--- a/glances/plugins/glances_processlist.py
+++ b/glances/plugins/glances_processlist.py
@@ -21,6 +21,7 @@
import os
import shlex
+import copy
from datetime import timedelta
from glances.compat import iteritems
@@ -80,7 +81,7 @@ class Plugin(GlancesPlugin):
self.nb_log_core = 0
# Get the max values (dict)
- self.max_values = glances_processes.max_values()
+ self.max_values = copy.deepcopy(glances_processes.max_values())
# Get the maximum PID number
# Use to optimize space (see https://github.com/nicolargo/glances/issues/959)
@@ -111,7 +112,8 @@ class Plugin(GlancesPlugin):
self.stats = glances_processes.getlist()
# Get the max values (dict)
- self.max_values = glances_processes.max_values()
+ # Use Deep copy to avoid change between update and display
+ self.max_values = copy.deepcopy(glances_processes.max_values())
elif self.input_method == 'snmp':
# No SNMP grab for processes
@@ -304,7 +306,8 @@ class Plugin(GlancesPlugin):
msg = '{:>10}'.format('?')
ret.append(self.curse_add_line(msg, optional=True))
# IO read/write
- if 'io_counters' in p:
+ if 'io_counters' in p and p['io_counters'][4] == 1:
+ # Display rate if stats is available and io_tag ([4]) == 1
# IO read
io_rs = int((p['io_counters'][0] - p['io_counters'][2]) / p['time_since_update'])
if io_rs == 0:
diff --git a/glances/processes.py b/glances/processes.py
index 0412358a..897acd62 100644
--- a/glances/processes.py
+++ b/glances/processes.py
@@ -149,6 +149,8 @@ class GlancesProcesses(object):
return int(f.read())
except (OSError, IOError):
return None
+ else:
+ return None
@property
def max_processes(self):
@@ -405,6 +407,68 @@ class GlancesProcesses(object):
if self.disable_tag:
return
+ # Grab the stats
+ mandatories_attr = ['cmdline', 'cpu_percent', 'cpu_times',
+ 'io_counters', 'memory_info', 'memory_percent',
+ 'name', 'nice', 'pid',
+ 'ppid', 'status', 'username']
+ # and build the processes stats list
+ self.processlist = [p.info for p in sorted(psutil.process_iter(attrs=mandatories_attr,
+ ad_value=None),
+ key=lambda p: p.info['cpu_percent'])]
+
+ # Update the maximum process ID (pid) number
+ self.processcount['pid_max'] = self.pid_max
+
+ # Loop over processes and add metadata
+ for proc in self.processlist:
+ # Time since last update (for disk_io rate computation)
+ proc['time_since_update'] = getTimeSinceLastUpdate('process_disk')
+
+ # Process status (only keep the first char)
+ proc['status'] = str(proc['status'])[:1].upper()
+
+ # Process IO
+ # procstat['io_counters'] is a list:
+ # [read_bytes, write_bytes, read_bytes_old, write_bytes_old, io_tag]
+ # If io_tag = 0 > Access denied (display "?")
+ # If io_tag = 1 > No access denied (display the IO rate)
+ # Availability: all platforms except macOS and Illumos/Solaris
+ if proc['io_counters'] is not None:
+ io_new = [proc['io_counters'].read_bytes,
+ proc['io_counters'].write_bytes]
+ # For IO rate computation
+ # Append saved IO r/w bytes
+ try:
+ proc['io_counters'] = io_new + self.io_old[proc['pid']]
+ io_tag = 1
+ except KeyError:
+ proc['io_counters'] = io_new + [0, 0]
+ io_tag = 0
+ # then save the IO r/w bytes
+ self.io_old[proc['pid']] = io_new
+ else:
+ proc['io_counters'] = [0, 0] + [0, 0]
+ io_tag = 0
+
+ # Append the IO tag (for display)
+ proc['io_counters'] += [io_tag]
+
+ # Compute the maximum value for keys in self._max_values_list
+ # Compute max
+ for k in self._max_values_list:
+ self.set_max_values(k, max(i[k] for i in self.processlist))
+
+ def update_OLD(self):
+ """Update the processes stats."""
+ # Reset the stats
+ self.processlist = []
+ self.reset_processcount()
+
+ # Do not process if disable tag is set
+ if self.disable_tag:
+ return
+
# Get the time since last update
time_since_update = getTimeSinceLastUpdate('process_disk')
diff --git a/requirements.txt b/requirements.txt
index 4cc0c6c0..00399543 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1 +1 @@
-psutil==5.2.2
+psutil==5.4.2