Linux中通过/proc/stat等文件计算Cpu使用率(二)

简介:

单核情况下Cpu使用率的计算

基本思想

通过读取/proc/stat /proc/<pid>/stat/proc/<pid>/task/<tid>/stat以及/proc/cpuinfo这几个文件获取总的Cpu时间、进程的Cpu时间、线程的Cpu时间以及Cpu的个数的信息,然后通过一定的算法进行计算(采样两个足够短的时间间隔的Cpu快照与进程快照来计算进程的Cpu使用率)

 

总的Cpu使用率计算

计算方法:

1、  采样两个足够短的时间间隔的Cpu快照,分别记作t1,t2,其中t1t2的结构均为:

(usernicesystemidleiowaitirqsoftirqstealstolenguest)9元组;

2、  计算总的Cpu时间片totalCpuTime

a)         把第一次的所有cpu使用情况求和,得到s1;

b)         把第二次的所有cpu使用情况求和,得到s2;

c)         s2 - s1得到这个时间间隔内的所有时间片,即totalCpuTime = j2 - j1 ;

3、计算空闲时间idle

idle对应第四列的数据,用第二次的第四列 第一次的第四列即可

idle=第二次的第四列 第一次的第四列

6、计算cpu使用率

pcpu =100* (total-idle)/total

某一进程Cpu使用率的计算

计算方法:  

1.               采样两个足够短的时间间隔的cpu快照与进程快照,

a)         每一个cpu快照均为(usernicesystemidleiowaitirqsoftirqstealstolenguest)9元组;

b)         每一个进程快照均为 (utimestimecutimecstime)4元组;

2.               分别根据结论2、结论3计算出两个时刻的总的cpu时间与进程的cpu时间,分别记作:totalCpuTime1totalCpuTime2processCpuTime1processCpuTime2

3.               计算该进程的cpu使用率pcpu = 100*( processCpuTime2 – processCpuTime1) / (totalCpuTime2 – totalCpuTime1) (100%计算,如果是多核情况下还需乘以cpu的个数);

实验数据

实验一: 监控一空循环的进程的cpu使用率。

说明:左边的数据是按以上算法得到的数据,其中采样的时间间隔与top命令刷新屏幕的时间间隔相同。

按以上方法计算得到的cpu使用率

通过top命令得到的

 

99.50083

98.333336

98.0

98.83138

99.0

99.0

99.83361

98.83527

98.4975

 

PID    USER      PR   NI   VIRT   RES   SHR   S  %CPU %MEM  TIME+  COMMAND 

7639 fjzag     20   0  206m  10m 7136 S   99  2.2   1:00.74 java              

 7639 fjzag     20   0  206m  10m 7136 S   99  2.2   1:03.71 java              

 7639 fjzag     20   0  206m  10m 7136 S   99  2.2   1:06.67 java              

 7639 fjzag     20   0  206m  10m 7136 S   99  2.2   1:09.63 java              

 7639 fjzag     20   0  206m  10m 7136 S   98  2.2   1:12.59 java              

 7639 fjzag     20   0  206m  10m 7136 S   99  2.2   1:15.55 java              

 7639 fjzag     20   0  206m  10m 7136 S  100  2.2   1:18.55 java              

 7639 fjzag     20   0  206m  10m 7136 S  100  2.2   1:21.54 java              

 7639 fjzag     20   0  206m  10m 7136 S   99  2.2   1:24.52 java              

 7639 fjzag     20   0  206m  10m 7136 S   98  2.2   1:27.46 java

 

实验二: 监控jconsole进程的cpu使用率。

说明:左边的数据是按以上算法得到的数据,其中采样的时间间隔与top命令刷新屏幕的时间间隔相同。

按以上方法计算得到的cpu使用率

通过top命令得到的

 

8.681135

12.0

10.350584

7.6539097

7.6539097

5.0

13.021703

11.0

8.666667

PID   USER      PR   NI  VIRT   RES   SHR  S  %CPU %MEM  TIME+  COMMAND 

7753 fjzag     20   0  252m  72m  22m S   10 14.4   0:18.70 jconsole          

 7753 fjzag     20   0  252m  72m  22m S   12 14.4   0:19.07 jconsole          

 7753 fjzag     20   0  252m  72m  22m S   11 14.4   0:19.39 jconsole          

 7753 fjzag     20   0  252m  72m  22m S    7 14.4   0:19.61 jconsole          

 7753 fjzag     20   0  252m  72m  22m S    7 14.4   0:19.83 jconsole          

 7753 fjzag     20   0  252m  72m  22m S    5 14.4   0:19.97 jconsole          

 7753 fjzag     20   0  252m  72m  22m S   14 14.4   0:20.38 jconsole          

 7753 fjzag     20   0  252m  72m  22m S   10 14.4   0:20.68 jconsole          

 7753 fjzag     20   0  252m  72m  22m S    9 14.5   0:20.96 jconsole

某一线程Cpu使用率的计算

计算方法:  

1.               采样两个足够短的时间隔的cpu快照与线程快照,

a)         每一个cpu快照均为(usernicesystemidleiowaitirqsoftirqstealstealonguest)9元组;

b)         每一个线程快照均为 (utimestime)2元组;

2.               分别根据结论2、结论4计算出两个时刻的总的cpu时间与线程的cpu时间,分别记作:totalCpuTime1totalCpuTime2threadCpuTime1threadCpuTime2

3.               计算该线程的cpu使用率pcpu = 100*( threadCpuTime2 – threadCpuTime1) / (totalCpuTime2 – totalCpuTime1) (100%计算,如果是多核情况下还需乘以cpu的个数);

实验数据

实验一: 监控一空循环的线程的cpu使用率。

说明:左边的数据是按以上算法得到的数据,其中采样的时间间隔与top命令刷新屏幕的时间间隔相同。

按以上方法计算得到的cpu使用率

通过top命令得到的

 

98.83138

97.00997

96.98997

97.49583

98.169716

96.8386

97.333336

93.82304

98.66667

PID    USER      PR   NI   VIRT   RES   SHR   S  %CPU %MEM  TIME+  COMMAND 

7649 fjzag     20   0  206m  10m 7136 R   97  2.2   7:22.94 java              

 7649 fjzag     20   0  206m  10m 7136 R   97  2.2   7:25.86 java              

 7649 fjzag     20   0  206m  10m 7136 R   97  2.2   7:28.76 java              

 7649 fjzag     20   0  206m  10m 7136 R   99  2.2   7:31.72 java              

 7649 fjzag     20   0  206m  10m 7136 R   98  2.2   7:34.65 java              

 7649 fjzag     20   0  206m  10m 7136 R   96  2.2   7:37.53 java              

 7649 fjzag     20   0  206m  10m 7136 R   98  2.2   7:40.47 java              

 7649 fjzag     20   0  206m  10m 7136 R   96  2.2   7:43.34 java              

 7649 fjzag     20   0  206m  10m 7136 R   97  2.2   7:46.25 java

 

实验二: 监控jconsole程序某一线程的cpu使用率。

说明:左边的数据是按以上算法得到的数据,其中采样的时间间隔与top命令刷新屏幕的时间间隔相同。

按以上方法计算得到的cpu使用率

通过top命令得到的

 

1.3400335

6.644518

1.3333334

0.6677796

0.6666667

1.3333334

1.3333334

 PID    USER      PR   NI   VIRT   RES  SHR  S  %CPU %MEM  TIME+  COMMAND 

7755 fjzag     20   0  251m  72m  22m S    1 14.4   0:11.92 jconsole          

 7755 fjzag     20   0  251m  72m  22m S    7 14.4   0:12.12 jconsole          

 7755 fjzag     20   0  251m  72m  22m S    2 14.4   0:12.18 jconsole          

 7755 fjzag     20   0  251m  72m  22m S    0 14.4   0:12.18 jconsole          

 7755 fjzag     20   0  251m  72m  22m S    1 14.4   0:12.20 jconsole          

 7755 fjzag     20   0  251m  72m  22m S    1 14.4   0:12.24 jconsole          

 7755 fjzag     20   0  251m  72m  22m S    1 14.4   0:12.28 jconsole

多核情况下cpu使用率的计算                                                    

以下通过实验数据来说明多核情况下某一进程cpu使用率是按cpu个数*100%计算的.

实验一

描述:

双核的情况下作的一组实验,第一组数据是通过ps  -eLo pid,lwp,pcpu | grep 9140命令查看进程号为9140的进程中各线程的详细信息。第二组数据是通过 ps命令查看进程号为9140进程的cpu使用率。

数据一:

pid   lwp  %cpu

9140  9140  0.0
 9140  9141  0.0
 9140  9142  0.0
 9140  9143  0.0
 9140  9144  0.0
 9140  9149  0.0
 9140  9150  0.0
 9140  9151  0.0
 9140  9152  0.1
 
9140  9153 96.6                         该线程是一个空循环
 9140  9154 95.9
                         该线程是一个空循环

以上除了红色标注出来的两个线程以外,其他的线程都是后台线程。

数据二:

pid   %cpu

9140  193

实验二

描述:

单核的情况下作的一组实验,第一组数据是通过ps  -eLo pid,lwp,pcpu | grep 6137命令查看进程号为6137的进程中各线程的详细信息。第二组数据是通过 ps命令查看进程号为6137进程的cpu使用率。

数据一:

 pid    lwp   %cpu

 6137  6137  0.0

 6137  6138  0.1

 6137  6143  0.0

 6137  6144  0.0

 6137  6145  0.0

 6137  6146  0.0

 6137  6147  0.0

 6137  6148  0.0

 6137  6149  0.0

 6137  6150 46.9                                                 空循环线程

 6137  6151 46.9                                                 空循环线程

以上除了红色标注出来的两个线程以外,其他的线程都是后台线程。

数据二

pid %cpu

6137 92.9

主要问题:

1.       不同内核版本/proc/stat文件格式不大一致。/proc/stat文件中第一行为总的cpu使用情况。

各个版本都有的4个字段: usernicesystemidle

2.5.41版本新增字段:iowait

2.6.0-test4新增字段:irqsoftirq

2.6.11新增字段:stealstolen                     which is the time spent in other operating

systems when running in a virtualized environment

2.6.24新增字段:guest:                                    which is the time spent running a virtual  CPU  for  guest operating systems under the control of the Linux kernel

2/proc/pid/task目录是Linux 2.6.0-test6之后才有的功能。

 

3.关于出现cpu使用率为负的情况,目前想到的解决方案是如果出现负值,连续采样计算cpu使用率直到为非负。

 

4. 有些线程生命周期较短,可能在我们采样期间就已经死掉了.






     本文转自 驿落黄昏 51CTO博客,原文链接:http://blog.51cto.com/yiluohuanghun/1153852,如需转载请自行联系原作者




相关文章
|
2月前
|
存储 数据管理 Linux
区分Linux中.tar文件与.tar.gz文件的不同。
总之,".tar"文件提供了一种方便的文件整理方式,其归档但不压缩的特点适用于快速打包和解压,而".tar.gz"文件通过额外的压缩步骤,尽管处理时间更长,但可以减小文件尺寸,更适合于需要节约存储空间或进行文件传输的场景。用户在选择时应根据具体需求,考虑两种格式各自的优劣。
327 13
|
3月前
|
安全 Linux
Linux赋予文件000权限的恢复技巧
以上这些步骤就像是打开一扇锁住的门,步骤看似简单,但是背后却有着严格的逻辑和规则。切记,在任何时候,变更文件权限都要考虑安全性,不要无谓地放宽权限,那样可能
120 16
|
3月前
|
存储 Linux 数据处理
深入剖析Linux中一切即文件的哲学和重定向的机制
在计算机的奇妙世界中,Linux的这套哲学和机制减少了不同类型资源的处理方式,简化了抽象的概念,并蕴藏着强大的灵活性。就像变戏法一样,轻轻松松地在文件、程序与设备之间转换数据流,标准输入、输出、错误流就在指尖舞动,程序的交互和数据处理因此变得既高效又富有乐趣。
52 4
|
4月前
|
Ubuntu Linux
"unzip"命令解析:Linux下如何处理压缩文件。
总的来说,`unzip`命令是Linux系统下一款实用而方便的ZIP格式文件处理工具。本文通过简明扼要的方式,详细介绍了在各类Linux发行版上安装 `unzip`的方法,以及如何使用 `unzip`命令进行解压、查看和测试ZIP文件。希望本文章能为用户带来实际帮助,提高日常操作的效率。
558 12
|
3月前
|
Linux
linux文件重命名命令
本指南介绍Linux文件重命名方法,包括单文件操作的`mv`命令和批量处理的`rename`命令。`mv`可简单更改文件名并保留扩展名,如`mv old_file.txt new_name.txt`;`rename`支持正则表达式,适用于复杂批量操作,如`rename &#39;s/2023/2024/&#39; *.log`。提供实用技巧如大小写转换、数字序列处理等,并提醒覆盖风险与版本差异,建议使用`-n`参数预览效果。
|
2月前
|
存储
阿里云轻量应用服务器收费标准价格表:200Mbps带宽、CPU内存及存储配置详解
阿里云香港轻量应用服务器,200Mbps带宽,免备案,支持多IP及国际线路,月租25元起,年付享8.5折优惠,适用于网站、应用等多种场景。
582 0
|
24天前
|
弹性计算 前端开发 NoSQL
2025最新阿里云服务器配置选择攻略:CPU、内存、带宽与系统盘全解析
本文详解2025年阿里云服务器ECS配置选择策略,涵盖CPU、内存、带宽与系统盘推荐,助你根据业务需求精准选型,提升性能与性价比。
|
2月前
|
存储 弹性计算 固态存储
阿里云服务器配置费用整理,支持一万人CPU内存、公网带宽和存储IO性能全解析
要支撑1万人在线流量,需选择阿里云企业级ECS服务器,如通用型g系列、高主频型hf系列或通用算力型u1实例,配置如16核64G及以上,搭配高带宽与SSD/ESSD云盘,费用约数千元每月。
174 0
|
4月前
|
数据可视化 Linux iOS开发
Python测量CPU和内存使用率
这些示例帮助您了解如何在Python中测量CPU和内存使用率。根据需要,可以进一步完善这些示例,例如可视化结果或限制程序在特定范围内的资源占用。
169 22