通过/proc/stat计算linux系统即时CPU使用率

/proc/stat

/proc文件系统是一个伪文件系统,它存在于内存中,不占用外存空间。它以文件系统的方式为内核与进程提供通信接口。用户和应用程序可以通过/proc得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程是动态改变的,所以用户或应用程序读取/proc目录中的文件的时,/proc文件系统是动态从系统内核读出所需信息并提交的。
在linux或Ubuntu系统中,/proc/stat文件记录了所有CPU活动的信息,该文件中的所有值都是从系统启动开始累计到当前的值。我们可以通过一个较小的时间段的CPU利用率值来估算某一个时刻的CPU利用率。首先我们先来查看一下/proc/stat中的内容:

1
2
3
4
5
6
$ cat /proc/stat
cpu 15543 334 4963 142337 3413 0 180 0 0 0
cpu0 3877 142 1137 35988 615 0 28 0 0 0
cpu1 3866 23 1068 35982 608 0 74 0 0 0
cpu2 4104 159 1333 35395 735 0 59 0 0 0
cpu3 3695 9 1424 34970 1454 0 18 0 0 0

上面的信息中前八个是比较重要的。

  • user(15543): 从系统启动到当前时刻,处于用户态的时间(用户空间的CPU时间),不包括nice为负值的进程。
  • nice(334): 从系统启动到当前时刻,nice值为负的进程所占的CPU时间。
  • system(4963): 从系统启动到当前时刻,处于内核状态的CPU时间。
  • idle(142337): 从系统启动到当前时刻,除了I/O等待时间以外的其他等待时间
  • iowait(3413): ~,IO等待时间
  • irq(0): ~, 硬中断时间
  • softrq(180): ~,软中断时间。
  • steal: ~,在虚拟环境中运行的时间。

总的CPU时间为:total = user+nice+system+idle+iowait+irq+softrq

计算当前时刻的CPU使用率

我们使用距离当前时刻较小的间隔的时间段的CPU使用率近似当前时刻的CPU使用率。

1
2
CPU Usage=1 - (△idle+△iowait) / △total_time
=1 - (idle2+iowait2 - idle1 - iowait1) / (total_time2 - total_time1)