提交 88115d71 编写于 作者: A Alessio Sergi

glances_percpu.py: use psutil's cpu_percent and cpu_times_percent methods

Rely on both methods to get per-CPU stats as a percentage.
Replace the 'homemade' one.
上级 f907069c
......@@ -26,9 +26,10 @@ from glances.plugins.glances_plugin import GlancesPlugin
class Plugin(GlancesPlugin):
"""Glances' per-CPU plugin.
"""Glances per-CPU plugin.
stats is a list
'stats' is a list of dictionaries that contain the utilization percentages
for each CPU.
"""
def __init__(self, args=None):
......@@ -40,8 +41,6 @@ class Plugin(GlancesPlugin):
# Init stats
self.reset()
self.percputime_total_new = []
self.percputime_new = []
def reset(self):
"""Reset/init the stats."""
......@@ -52,72 +51,33 @@ class Plugin(GlancesPlugin):
# Reset stats
self.reset()
# Grab per-CPU stats using psutil's cpu_percent(percpu=True) and
# cpu_times_percent(percpu=True) methods
if self.get_input() == 'local':
# Update stats using the standard system lib
# Grab CPU using the PSUtil cpu_times method
# Per-CPU
percputime = psutil.cpu_times(percpu=True)
percputime_total = []
for i in range(len(percputime)):
percputime_total.append(percputime[i].user +
percputime[i].system +
percputime[i].idle)
# Only available on some OS
for i in range(len(percputime)):
if hasattr(percputime[i], 'nice'):
percputime_total[i] += percputime[i].nice
for i in range(len(percputime)):
if hasattr(percputime[i], 'iowait'):
percputime_total[i] += percputime[i].iowait
for i in range(len(percputime)):
if hasattr(percputime[i], 'irq'):
percputime_total[i] += percputime[i].irq
for i in range(len(percputime)):
if hasattr(percputime[i], 'softirq'):
percputime_total[i] += percputime[i].softirq
for i in range(len(percputime)):
if hasattr(percputime[i], 'steal'):
percputime_total[i] += percputime[i].steal
if not hasattr(self, 'percputime_old'):
self.percputime_old = percputime
self.percputime_total_old = percputime_total
else:
self.percputime_new = percputime
self.percputime_total_new = percputime_total
perpercent = []
try:
for i in range(len(self.percputime_new)):
perpercent.append(100 / (self.percputime_total_new[i] -
self.percputime_total_old[i]))
cpu = {'user': (self.percputime_new[i].user -
self.percputime_old[i].user) * perpercent[i],
'system': (self.percputime_new[i].system -
self.percputime_old[i].system) * perpercent[i],
'idle': (self.percputime_new[i].idle -
self.percputime_old[i].idle) * perpercent[i]}
if hasattr(self.percputime_new[i], 'nice'):
cpu['nice'] = (self.percputime_new[i].nice -
self.percputime_old[i].nice) * perpercent[i]
if hasattr(self.percputime_new[i], 'iowait'):
cpu['iowait'] = (self.percputime_new[i].iowait -
self.percputime_old[i].iowait) * perpercent[i]
if hasattr(self.percputime_new[i], 'irq'):
cpu['irq'] = (self.percputime_new[i].irq -
self.percputime_old[i].irq) * perpercent[i]
if hasattr(self.percputime_new[i], 'softirq'):
cpu['softirq'] = (self.percputime_new[i].softirq -
self.percputime_old[i].softirq) * perpercent[i]
if hasattr(self.percputime_new[i], 'steal'):
cpu['steal'] = (self.percputime_new[i].steal -
self.percputime_old[i].steal) * perpercent[i]
self.stats.append(cpu)
self.percputime_old = self.percputime_new
self.percputime_total_old = self.percputime_total_new
except Exception:
self.reset()
percpu_percent = psutil.cpu_percent(interval=0.0, percpu=True)
percpu_times_percent = psutil.cpu_times_percent(interval=0.0, percpu=True)
for cputimes in percpu_times_percent:
for cpupercent in percpu_percent:
cpu = {'total': cpupercent,
'user': cputimes.user,
'system': cputimes.system,
'idle': cputimes.idle}
# The following stats are for API purposes only
if hasattr(cputimes, 'nice'):
cpu['nice'] = cputimes.nice
if hasattr(cputimes, 'iowait'):
cpu['iowait'] = cputimes.iowait
if hasattr(cputimes, 'irq'):
cpu['irq'] = cputimes.irq
if hasattr(cputimes, 'softirq'):
cpu['softirq'] = cputimes.softirq
if hasattr(cputimes, 'steal'):
cpu['steal'] = cputimes.steal
if hasattr(cputimes, 'guest'):
cpu['guest'] = cputimes.guest
if hasattr(cputimes, 'guest_nice'):
cpu['guest_nice'] = cputimes.guest_nice
self.stats.append(cpu)
else:
# Update stats using SNMP
pass
......@@ -140,40 +100,34 @@ class Plugin(GlancesPlugin):
msg = '{0:8}'.format(_("PER CPU"))
ret.append(self.curse_add_line(msg, "TITLE"))
# Total CPU usage
# Total per-CPU usage
for cpu in self.stats:
msg = ' {0:>6.1%}'.format((100 - cpu['idle']) / 100)
msg = '{0:>6}%'.format(cpu['total'])
ret.append(self.curse_add_line(msg))
# User CPU
if 'user' in self.stats[0]:
# New line
ret.append(self.curse_new_line())
msg = '{0:8}'.format(_("user:"))
ret.append(self.curse_add_line(msg))
for cpu in self.stats:
msg = ' {0:>6.1%}'.format(cpu['user'] / 100)
ret.append(self.curse_add_line(msg, self.get_alert(cpu['user'], header="user")))
# System CPU
if 'user' in self.stats[0]:
# New line
ret.append(self.curse_new_line())
msg = '{0:8}'.format(_("system:"))
ret.append(self.curse_add_line(msg))
for cpu in self.stats:
msg = ' {0:>6.1%}'.format(cpu['system'] / 100)
ret.append(self.curse_add_line(msg, self.get_alert(cpu['system'], header="system")))
# Idle CPU
if 'user' in self.stats[0]:
# New line
ret.append(self.curse_new_line())
msg = '{0:8}'.format(_("idle:"))
# User per-CPU
ret.append(self.curse_new_line())
msg = '{0:8}'.format(_("user:"))
ret.append(self.curse_add_line(msg))
for cpu in self.stats:
msg = '{0:>6}%'.format(cpu['user'])
ret.append(self.curse_add_line(msg, self.get_alert(cpu['user'], header="user")))
# System per-CPU
ret.append(self.curse_new_line())
msg = '{0:8}'.format(_("system:"))
ret.append(self.curse_add_line(msg))
for cpu in self.stats:
msg = '{0:>6}%'.format(cpu['system'])
ret.append(self.curse_add_line(msg, self.get_alert(cpu['system'], header="system")))
# Idle per-CPU
ret.append(self.curse_new_line())
msg = '{0:8}'.format(_("idle:"))
ret.append(self.curse_add_line(msg))
for cpu in self.stats:
msg = '{0:>6}%'.format(cpu['idle'])
ret.append(self.curse_add_line(msg))
for cpu in self.stats:
msg = ' {0:>6.1%}'.format(cpu['idle'] / 100)
ret.append(self.curse_add_line(msg))
# Return the message with decoration
return ret
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册