从/ proc/stat计算用户,nice,sys,idle,iowait,irq和sirq

jgr*_*jgr 8 c python linux kernel procfs

/ proc/stat显示用户,nice,sys,idle,iowait,irq和sirq的滴答:

cpu 6214713 286 1216407 121074379 260283 253506 197368 0 0 0

如何使用这些值计算用户的个人利用率(%),等等?就像'top'或'vmstat'中显示的值一样.

jgr*_*jgr 11

此代码计算所有核心上的用户利用率.

import os
import time
import multiprocessing

def main():
    jiffy = os.sysconf(os.sysconf_names['SC_CLK_TCK'])
    num_cpu = multiprocessing.cpu_count()

    stat_fd = open('/proc/stat')
    stat_buf = stat_fd.readlines()[0].split()
    user, nice, sys, idle, iowait, irq, sirq = ( float(stat_buf[1]), float(stat_buf[2]),
                                            float(stat_buf[3]), float(stat_buf[4]),
                                            float(stat_buf[5]), float(stat_buf[6]),
                                            float(stat_buf[7]) )

    stat_fd.close()

    time.sleep(1)

    stat_fd = open('/proc/stat')
    stat_buf = stat_fd.readlines()[0].split()
    user_n, nice_n, sys_n, idle_n, iowait_n, irq_n, sirq_n = ( float(stat_buf[1]), float(stat_buf[2]),.
                                                            float(stat_buf[3]), float(stat_buf[4]),
                                                            float(stat_buf[5]), float(stat_buf[6]),
                                                            float(stat_buf[7]) )

    stat_fd.close()

    print ((user_n - user) * 100 / jiffy) / num_cpu

if __name__ == '__main__':
    main()
Run Code Online (Sandbox Code Playgroud)


Mat*_*Mat 4

Documentation/filesystems/proc.txt

(...) 这些数字标识 CPU 执行不同类型工作所花费的时间量。时间单位为 USER_HZ(通常为百分之一秒)。

因此,要计算利用率百分比,您需要:

  • 找出USER_HZ机器上有什么
  • 查看系统启动以来已经过去了多长时间。

第二个很简单:btime同一个文件中有一行您可以使用它。有关信息USER_HZ,请查看如何获取每 jiffy 的毫秒数

  • 每列测量自启动以来在给定模式下花费的时间。如果您以 1 秒的间隔读取两个读数,然后将 USER 列中的值相减,您就会知道一秒钟内在用户模式下花费了多少个时钟周期。一旦您知道了这一点以及每秒有多少个滴答声,您就可以计算出您的百分比。 (2认同)