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<=NF;i++)j+=$i;print "cpu_total_slice " j;}'
cpu_total_slice 19208187744

很多地方看到都只是统计前面四列或者五列,这是不完整的;不过,因为通常前四、五列是CPU的主要消耗,所以这样如此计算也通常是准确的。例如,上例中,前面五列的消耗是CPU消耗的99.99%。

(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 during 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利用率。

转载于:https://www.cnblogs.com/yuyue2014/p/4789087.html

Linux如何统计进程的CPU利用率相关推荐

  1. linux. 获得cpu利用率 arm,Linux如何统计进程的CPU利用率

    0. 为什么写这篇博客 Linux的top或者ps都可以查看进程的cpu利用率,那为什么还需要了解这个细节呢.编写这篇文章呢有如下三个原因: * 希望在脚本中,能够以过"非阻塞"的 ...

  2. linux系统gpk-update-icon进程占用CPU资源100%

    1. 症状:linux系统gpk-update-icon进程占用CPU资源100%,监控到用户进程跑到100% 2.原因分析: gpk-update-icon进程在GUI模式下会自动通知rpm软件包更 ...

  3. linux c统计进程网络读写,linux网络分析、性能分析、文本格式化、文件读写操作之利器(mtr、top、jq、sponge)...

    好的工具能够让我们工作更加高效,结合工作中的情况,今天分享下linux下比较好用的几个工具. 网络分析工具 mtr mtr是网络链路检测判断问题非常好用的工具,集成了tracert和ping这两个命令 ...

  4. linux中yum进程占cpu百分之九十,在Deepin Linux系统中kworker进程占用CPU达到100%的解决...

    如果你在Deepin Linux.Debian.Ubuntu系统中遇到kworker进程占用CPU达到100%,可以用以下解决方法解决问题,本文主要内容为问题起因.microcode介绍.解决方法及总 ...

  5. linux监测指定进程的CPU及物理内存消耗情况(c程序)

    近日,由于工作要求,研究了一下如何在linux系统下对某个指定的单个进程进行监测,分析其CPU及物理内存的使用情况,并基于c语言写了一个独立的模块,完整的实现上述功能.现将整个模块的代码贴上,以便日后 ...

  6. 【Linux】限制进程的CPU使用率

    目录 限制进程CPU使用率 限制进程资源的工具 限制进程CPU使用率 工具  cpulimit 安装 1. cpulimit安装 1.1 Ubuntu/Debian: # apt-get instal ...

  7. linux 进程 锁定cpu,如何限制Linux中任何进程的CPU使用情况 | MOS86

    有没有经历过您打开一个特定应用程序(如Firefox)的情况,并使整个系统处于停顿状态?如果您正在运行Web服务器,最后一件事就是让应用程序崩溃整个系统并将所有网站关闭. Cpulimit是一个可以限 ...

  8. window和linux和android进程内存CPU等监控软件

    1.面向window和linux和android三个平台. 2.线程可监控物理内存,虚拟内存,CPU和GPU等占用情况. 3.输出结果保存为exls或者csv可进行图形化分析 下载地址:下载地址

  9. 解决linux中Kipmi0进程对CPU使用率很高问题

    突然top发现Kipmi0进程一直占用近乎100%的一个核的资源,并且已经持续了很长一段时间. google查不到多少资料,看到一篇说法:是一些平台接口的管理器.不敢贸然杀死,再查查资料. 看看专业的 ...

最新文章

  1. linux qml 环境,利用Qml与Golang打造Gui客户端(二)qamel环境安装
  2. 如何通过SQL按内容拆分字段(将一个字段值拆分两个字段)
  3. 云计算的未来是什么?
  4. iOS tableview嵌套collectionview
  5. Qt 防止程序二次运行 实现应用单例
  6. 模块参考资料-Cat.1模块选型手册-
  7. Chrome 添加自定义搜索引擎
  8. 3DText无法被物体遮挡 - 解决
  9. redis Lettuce客户端
  10. 跑跑卡丁车蛋白石盒喜当托儿纪念,2022/06/12,22:59:24
  11. Cadence的版图绘制、DRC、LVS、PEX-以反相器为例
  12. bm 37 bm38
  13. B类:1010 一元多项式求导 (25 分)
  14. 软考——程序设计语言概述
  15. 【算法设计与分析】1.主定理
  16. 论文精读《Prototypical Networks for Few-shot Learning》
  17. php先乘除还是先加减,加减乘除运算法则是什么?
  18. 轻薄本外接显示器后图像不清晰的问题
  19. oppo三面面经,现已拿到offer。十月份我快乐了,你呢?
  20. C艹数组(各种姿势详解)

热门文章

  1. 在css使用PHP/ASP代码
  2. JavaScript中的Array对象方法调用
  3. codeforces-1201 C Maximum Median
  4. 【bzoj2084】[Poi2010]Antisymmetry
  5. [转]设计模式六大原则[1]:单一职责原则
  6. 【2017-3-2】集合 结构体 枚举
  7. Spark Scalaa 几个常用的示例
  8. Apache Maven 3.0.3 (yum) 安裝 (CentOS 6.4 x64)
  9. JAVA笔记:Java常用类库
  10. 多台电脑共享一套鼠标键盘的免费方法