我想用Python监视Mac上当前系统范围的CPU使用情况。
我编写了一些以'ps'开头的代码,并将'%cpu'列中的所有值相加。
def psColumn(colName):
"""Get a column of ps output as a list"""
ps = subprocess.Popen(["ps", "-A", "-o", colName], stdout=subprocess.PIPE)
(stdout, stderr) = ps.communicate()
column = stdout.split("\n")[1:]
column = [token.strip() for token in column if token != '']
return column
def read(self):
values = map(float, psColumn("%cpu"))
return sum(values)
然而,我总是得到50%-80%的高读数,可能是由测量程序本身引起的。此CPU使用率峰值未在我的MenuMeters或其他系统监视程序上注册。我怎样才能获得更像MenuMeters会显示的读数? (我想检测一些程序占用CPU的关键情况。)
P.S。我试过了psutil,但是
psutil.cpu_percent()
总是返回100%,所以要么对我没用,要么我错误地使用它。
答案 0 :(得分:3)
为了检测某些程序占用CPU的关键情况,或许查看负载平均值会更好?看一下“uptime”命令。
负载平均数告诉您平均有多少进程正在使用或等待CPU执行。如果它接近或超过1.0,则意味着系统一直忙于某事。如果负载平均值不断提高,则意味着系统无法满足需求并且任务开始堆积。监视系统“运行状况”的负载平均值而不是CPU利用率有两个好处:
同时监控空闲RAM和交换也是一个好主意。
答案 1 :(得分:3)
>>> import psutil, time
>>> print psutil.cpu_times()
softirq=50.87; iowait=39.63; system=1130.67; idle=164171.41; user=965.15; irq=7.08; nice=0.0
>>>
>>> while 1:
... print round(psutil.cpu_percent(), 1)
... time.sleep(1)
...
5.4
3.2
7.3
7.1
2.5
答案 2 :(得分:1)
几周之前,我的工作基本上是相同的,我也遇到了psutil.cpu_percent()问题。
相反,我使用psutil.cpu_times(),它根据您的操作系统提供用于用户,系统,空闲和其他东西的CPU时间。我不知道这是一种好方法,还是一种准确的做事方式。
import psutil as ps
class cpu_percent:
'''Keep track of cpu usage.'''
def __init__(self):
self.last = ps.cpu_times()
def update(self):
'''CPU usage is specific CPU time passed divided by total CPU time passed.'''
last = self.last
current = ps.cpu_times()
total_time_passed = sum([current.__dict__.get(key, 0) - last.__dict__.get(key, 0) for key in current.attrs])
#only keeping track of system and user time
sys_time = current.system - last.system
usr_time = current.user - last.user
self.last = current
if total_time_passed > 0:
sys_percent = 100 * sys_time / total_time_passed
usr_percent = 100 * usr_time / total_time_passed
return sys_percent + usr_percent
else:
return 0
答案 3 :(得分:0)
对于psutil,当你在shell中运行.py文件时,正确的答案是
psutil.cpu_percent(interval=1)
不要忘记参数interval = 1,否则,它将返回0或100,可能是一个bug。