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

做者:http://blogread.cn/it/article/6774?f=wb1php

出处:http://blogread.cn/it/article/6774?f=wb1linux


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

    出处信息

0. 为何写这篇博客

Linux的top或者ps均可以查看进程的cpu利用率,那为何还须要了解这个细节呢。编写这篇文章呢有以下三个缘由:git

  
  
  
  
* 但愿在脚本中,可以以过”非阻塞”的方式获取进程cpu利用率 * ps没法得到进程当前时刻的CPU利用率;top则须要至少1秒才能得到进程当前的利用率 * * 好奇

1. 如何统计进程CPU利用率

1.0 概述

在Linux的/proc文件系统,能够看到自启动时候开始,全部CPU消耗的时间片;对于个进程,也能够看到进程消耗的时间片。这是一个累计值,能够"非阻塞"的输出。得到必定时间间隔的两次统计就能够计算出这段时间内的进程CPU利用率。shell

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

1.1 /proc/stat 统计总CPU消耗

这个概念在计算中并不重要,可是了解一下仍是有益的。在/proc/[pid/]stat中咱们能够看到系通通计的CPU时间消耗,这里都统一使用1/USER_HZ为一个时间片(man proc),多数状况下USER_HZ都是取值100,因此这里的一个时间片就是10ms。能够经过系统调用sysconf(_SC_CLK_TCK)来得到准确USER_HZ的取值。tcp

例如:ide

  
  
  
  
# 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)工具

对应以下:idea

  
  
  
  
# cat /proc/stat|grep "cpu "     |usr      |nice   |sys      |idle        |iowait   |irq   |softirq |steal  |guestcpu  |77918485 |720414 |61184026 |19052884316 |12152363 |1386  |1476742 |0      |0

因此,计算CPU总消耗可使用以下shell命令:spa

  
  
  
  
cat /proc/stat|grep "cpu "|awk '{for(i=2;i<=NF;i++)j+=$i;print "cpu_total_slice " j;}'cpu_total_slice 19208187744

不少地方看到都只是统计前面四列或者五列,这是不完整的;不过,由于一般前4、五列是CPU的主要消耗,因此这样如此计算也一般是准确的。例如,上例中,前面五列的消耗是CPU消耗的99.99%。

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

1.2 进程消耗的CPU时间片

在proc文件系统中,能够经过/proc/[pid]/stat得到进程消耗的时间片,输出的第1四、1五、1六、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利用率。

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

相关文章
相关标签/搜索