【问题标题】:Reliably monitor current CPU usage可靠地监控当前的 CPU 使用率
【发布时间】:2010-02-22 14:01:58
【问题描述】:

我想使用 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 的严重情况。)

附言我试过psutil,但是

psutil.cpu_percent()

总是返回 100%,所以要么对我没用,要么我用错了。

【问题讨论】:

    标签: python macos cpu


    【解决方案1】:

    当某些程序占用 CPU 时检测紧急情况,也许查看平均负载会更好?看看“uptime”命令。

    平均负载数告诉您平均有多少进程正在使用或等待 CPU 执行。如果它接近或超过 1.0,则意味着系统一直在忙于某些事情。如果平均负载不断上升,则意味着系统无法跟上需求,任务开始堆积。监控系统“运行状况”的平均负载而不是 CPU 利用率有两个优点:

    • 系统给出的平均负载已经被平均了。它们的波动不大,因此解析“ps”输出时不会出现问题。
    • 某些应用程序可能会抖动磁盘并导致系统无响应。在这种情况下,CPU 利用率可能较低,但平均负载仍然很高,表明存在问题。

    同时监控空闲 RAM 和交换也是一个好主意。

    【讨论】:

    • "1.0" 应该是 "1.0 * (NUMBER OF CPUs)"
    【解决方案2】:
    >>> 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
    

    【讨论】:

    • 不错,也许 psutil.cpu_percent(interval=1.0) 也有用
    【解决方案3】:

    几周前我在做基本相同的事情,我也遇到了 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
    

    【讨论】:

      【解决方案4】:

      对于psutil,当你在shell中运行.py文件时,正确的答案是

      psutil.cpu_percent(interval=1)
      

      不要忘记参数interval=1,否则会返回0或100,可能是bug。

      【讨论】:

        猜你喜欢
        • 2016-11-27
        • 2018-08-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-08
        相关资源
        最近更新 更多