从 /proc/stat 计算用户、良好、系统、空闲、iowait、irq 和 sirq

9 投票
2 回答
5905 浏览
提问于 2025-04-17 01:23

/proc/stat 文件显示了用户、nice、系统、空闲、等待输入输出、硬件中断和软中断的时间(以“滴答”计数),格式如下:

cpu 6214713 286 1216407 121074379 260283 253506 197368 0 0 0

我该如何根据这些数值计算出用户、nice 等的各自使用率(百分比)呢?就像在 'top' 或 'vmstat' 中显示的那些值。

2 个回答

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()
4

来自 Documentation/filesystems/proc.txt 的内容:

(...) 这些数字表示 CPU 花了多少时间在不同类型的工作上。时间单位是 USER_HZ(通常是百分之一秒)。

所以,要计算利用率的百分比,你需要:

  • 找出机器上的 USER_HZ 是多少
  • 找出系统启动到现在已经过了多久。

第二个比较简单:在同一个文件里有一行 btime,你可以用它来获取这个信息。至于 USER_HZ,可以查看 如何获取每个 jiffy 的毫秒数

撰写回答