问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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
抖音弹幕怎么关掉?怎么关闭抖音弹幕? 惠普LaserJet P3005D是否支持B5纸的双面打印? word打印出图片总是缺一部分怎么办-word打印图片不完整怎么解决_百度... 理想one哪里产的车辆? 抚州抚州ONE在哪里? one地址在哪里? 如何在图片上写字(如何在图片上添加文字) 网商贷为什么钱没到账 高级经济师职称怎么评 高级经济师需要评审吗 linux命令怎么查看占用CPU的进程 linux查看服务器cpu,内存使用情况 linux如何查看cpu使用率 Linux系统下怎样查看进程的CPU占用率 Linux下如何查看哪些进程占用的CPU内存资源最多 Linux系统上如何查看进程(线程)所运行的CPU linux怎么看进程cpu使用率 宋祖儿涓涓的照片那里有啊? 英雄连OL 步兵连4V4后期怎么打发??????? 我急需一个Word文件关于九寨沟的电子版报 双击word文档打不开,右键也不行 Word的文档在邮乡怎么是一些看不懂的字 我用word自动生成目录后一级标题和二级标题的制表符.....不一样,疏密不一致,该怎么办? 微信里发朋友圈,怎样才可以只发文字,不用发图片... 限号是什么意思啊! 2021车辆限号是怎么规定的? 郑州现在限号是怎么限的 车牌限号是怎么规定的?, 限号违章怎样处罚?扣分吗?扣几分?罚款金额是多少? 当天限号是几点到几点 linux中查看虚拟内存和cpu占用率的命令是什么 linux 下怎么查看一个进程占用内存大小 linux 如何查看进程运行在哪个cpu 如何查看linux的cpu使用率 linux查看哪个进程占用cpu linux系统怎么查看内存和CPU占用情况呀? linux如何查看当前占用CPU或内存最多的5个进程 linux怎么查看cpu使用率 linux 如何查看进程运行在哪个cpu 怎么使用Linux命令查看CPU使用率 小米手机怎么使用截屏功能? 小米手机怎么截屏呀? 腾讯 QQ 是用什么编程语言开发的? 腾讯QQ 是用什么编程语言开发的 如何才能注册新? 怎么申请呢? 怎样才能注册一个新的 注册一个新的怎么注册 怎样注册新 怎样申请微信?