Linux计算CPU占用率

/proc/stat 文件中我们可以获得一些内核活动信息,其中所有的数字都是从内核启动时开始计数的:

$ cat /proc/stat
cpu  2255 34 2290 22625563 6290 127 456 0 0 0
cpu0 1132 34 1441 11311718 3675 127 438 0 0 0
cpu1 1123 0 849 11313845 2614 0 18 0 0 0
intr 114930548 113199788 3 0 5 263 0 4 [... lots more numbers ...]
ctxt 1990473
btime 1062191376
processes 2915
procs_running 1
procs_blocked 0
softirq 183433 0 21755 12 39 1137 231 21459 2263

其中第一行 cpu 是后续 cpuN 对应值的和。这些数字代表不同类型工作花费的 CPU 时间,时间单位为 USER_HZ,各列的意义从左到右,如下所示:

字段 说明
user 运行用户态的普通进程,通常包含了 guest
nice 运行用户态的低优先级进程,通常包含了 guest_nice
system 内核态的进程执行
idle 空闲时间(twiddling thumbs,玩手指头)
iowait 等待 I/O 完成的时间。由于在等待 I/O 完成时,CPU 会切换到到其他任务,因此该值并非真正意义上的“等待时间”。在特定条件下,该值还会减少,所以该值并不可靠。
irq 中断服务
softirq 软中断服务
steal 非自愿的(involuntary)等待。如果当前系统运行在虚拟机中,则 hypervisor 可能会“偷”走一些 CPU 时间给宿主机或其他虚拟机。如果当前是物理机,则一般为 0。
guest 运行普通虚拟机(通常为 0)
guest_nice 运行低优先级虚拟机(通常为 0)

CPU 使用率的计算方式如下:

_cpu_idle = _idle + _iowait;
_cpu_work = _user + _nice + _system + _irq + _softirq;

cpu_idle = idle + iowait;
cpu_work = user + nice + system + irq + softirq;

interval = (cpu_idle + cpu_work) - (_cpu_idle + _cpu_work);
cpu_usage = 1 - (cpu_idle - _cpu_idle)/interval;

其余行的说明如下:

字段 说明
intr 自启动以来的中断服务数。第一列是包含无序号且特定于架构的中断在内的总中断数,后续列是每个中断序号的中断计数
ctxt 所有 CPU 中上下文切换的计数
btime 系统引导的时刻,自 epoch 以来的秒数
processes 创建过的进程和线程数,包括但不限于:fork()clone()、系统调用等
procs_running 运行中或准备运行的线程数量
procs_blocked 当前阻塞的进程数量
softirq 自启动以来的软中断服务次数。对于每个可能的系统软中断,第一列是所有的软中断,后续列对应于每个中断序号的中断计数

引用

猜你喜欢

转载自blog.csdn.net/kencaber/article/details/109823126