可靠地监控当前的CPU使用情况

时间:2010-02-22 14:01:59

标签: python macos cpu

我想用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%,所以要么对我没用,要么我错误地使用它。

4 个答案:

答案 0 :(得分:3)

为了检测某些程序占用CPU的关键情况,或许查看负载平均值会更好?看一下“uptime”命令。

负载平均数告诉您平均有多少进程正在使用或等待CPU执行。如果它接近或超过1.0,则意味着系统一直忙于某事。如果负载平均值不断提高,则意味着系统无法满足需求并且任务开始堆积。监视系统“运行状况”的负载平均值而不是CPU利用率有两个好处:

  • 系统给出的平均负载已经平均。它们不会波动那么多,因此解析“ps”输出时不会出现问题。
  • 某些应用可能会破坏磁盘并使渲染系统无响应。在这种情况下,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。