Linux如何统计进程的CPU利用率

发布网友 发布时间:2022-04-19 10:20

我来回答

1个回答

热心网友 时间:2023-10-24 03:43


0. 为什么写这篇博客 Linux的top或者ps都可以查看进程的cpu利用率,那为什么还需要了解这个细节呢。编写这篇文章呢有如下三个原因: * 希望在脚本中,能够以过”非阻塞”的方式获取进程cpu利用率* ps无法获得进程当前时刻的CPU利用率;top则需要至少1秒才能获




0. 为什么写这篇博客
Linux的top或者ps都可以查看进程的cpu利用率,那为什么还需要了解这个细节呢。编写这篇文章呢有如下三个原因:

* 希望在脚本中,能够以过”非阻塞”的方式获取进程cpu利用率
* ps无法获得进程当前时刻的CPU利用率;top则需要至少1秒才能获得进程当前的利用率
* * 好奇
1. 如何统计进程CPU利用率
1.0 概述
在Linux的/proc文件系统,可以看到自启动时候开始,所有CPU消耗的时间片;对于个进程,也可以看到进程消耗的时间片。这是一个累计值,可以"非阻塞"的输出。获得一定时间间隔的两次统计就可以计算出这段时间内的进程CPU利用率。

所以,是否存在一种简单的,非阻塞的方式获得进程的CPU利用率? 答案是:“没有”。这里给出来一个有趣的比喻:"这就像有人给你一张照片,要你回答照片中车子的速度一样"

1.1 /proc/stat 统计总CPU消耗
这个概念在计算中并不重要,但是了解一下还是有益的。在/proc/[pid/]stat中我们可以看到系统统计的CPU时间消耗,这里都统一使用1/USER_HZ为一个时间片(man proc),多数情况下USER_HZ都是取值100,所以这里的一个时间片就是10ms。可以通过系统调用sysconf(_SC_CLK_TCK)来获得准确USER_HZ的取值。

例如:

# cat /proc/stat|grep "cpu "
cpu 77918485 720414 61184026 19052884316 12152363 1386 1476742 0 0
每一列对应的CPU消耗含义是(man proc):用户态(user)、低优先级用户态(nice)、系统(sys)、闲置、IOWAIT(内核2.5.41+)、中断(since 2.6.0+)、软终端(since 2.6.0+)、steal(虚拟环境中其他OS消耗2.6.11+)、guest(为访客OS运行虚拟CPU消耗2.6.24)

对应如下:

# cat /proc/stat|grep "cpu "
|usr |nice |sys |idle |iowait |irq |softirq |steal |guest
cpu |77918485 |720414 |61184026 |19052884316 |12152363 |1386 |1476742 |0 |0
所以,计算CPU总消耗可以使用如下shell命令:

cat /proc/stat|grep "cpu "|awk '{for(i=2;i

(tips:这里的时间片和CPU时钟中断的jiffy不是一个概念,一个是内核态的,一个用户态的)

1.2 进程消耗的CPU时间片
在proc文件系统中,可以通过/proc/[pid]/stat获得进程消耗的时间片,输出的第14、15、16、17列分别对应进程用户态CPU消耗、内核态的消耗、用户态等待子进程的消耗、内核态等待子进程的消耗(man proc)。所以进程的CPU消耗可以使用如下命令:

cat /proc/9583/stat|awk '{print "cpu_process_total_slice " $14+$15+$16+$17}'
cpu_process_total_slice 1068099
tips:从这里可以看到,Linux并没有进程级别的iowait统计,如果想知道系统的iowait是哪个进程导致,则还需要一些其他的工具辅助。

1.3 "非阻塞"的计算进程CPU利用率
从这里也看到,是没有某个时刻CPU利用率的说法的,也就没法获得某个时刻的CPU利用率。这就像物理中的"速度"的概念,没有某一时刻速度的概念,速度一定是一个时间段之内的。那么要"非阻塞"计算某个进程CPU利用率,则需要取两次事件间隔进行计算,这两次事件间隔的操作可以是非阻塞的。计算办法如下:

* 时刻A,计算操作系统总CPU时间片消耗total_cpu_slice_A;计算进程总CPU时间片消耗;total_process_slice_A
* 时刻B,计算操作系统总CPU时间片消耗total_cpu_slice_B;计算进程总CPU时间片消耗;total_process_slice_B
B时刻就可以"非阻塞"的计算这段时间进程的CPU利用率了:

100%*(total_process_slice_B-total_process_slice_A)/(total_cpu_slice_B-total_cpu_slice_A)
1.4 ps命令显示的CPU利用率是什么意思
man ps
......
CPU usage is currently expressed as the percentage of time spent running ring the entire lifetime of a process. This is
not ideal, and it does not conform to the standards that ps otherwise conforms to. CPU usage is unlikely to add up to
exactly 100%.
......
可以看到,ps命令%CPU显示的是进程自启动时刻起,直至当前的总平均CPU利用率。

2 参考文档
* man proc / man ps

* Accurately Calculating CPU Utilization in Linux using /proc/stat@stackoverflow

* account_process_tick@Linux Kernel

* Troubleshooting High I/O Wait in Linux

* Top and ps not showing the same cpu result

博客的草稿箱里面虽然有好几篇稿子了,不过距离上一篇博客好像都有100天了,写完这一篇还是很欣慰,虽然内容不多。


原文地址:Linux如何统计进程的CPU利用率, 感谢原作者分享。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com