0

0

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

php中文网

php中文网

发布时间:2016-06-07 16:39:52

|

1349人浏览过

|

来源于php中文网

原创

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<=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是哪个进程导致,则还需要一些其他的工具辅助。

25175企业客户管理系统2.5.1
25175企业客户管理系统2.5.1

25175企业客户管理系统能够方便的录入新的信息例如新的项目、新增客户等同时能够清楚的管理一些款项结算。由于功能的强大,用户可以在该系统上发表文章后让员工递交工作计划或工作报告。加强企业工作效率,为企业提高实力。因为该系统可由客户、程序员、负责人等身份登入 所以适合广大企业使用。管理首页:{信息录入|信息修改|信息查询}1信息录入:你可以根据实际情况进行以下操作 1-1新的项目

下载

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

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

相关专题

更多
c++ 根号
c++ 根号

本专题整合了c++根号相关教程,阅读专题下面的文章了解更多详细内容。

22

2026.01.23

c++空格相关教程合集
c++空格相关教程合集

本专题整合了c++空格相关教程,阅读专题下面的文章了解更多详细内容。

24

2026.01.23

yy漫画官方登录入口地址合集
yy漫画官方登录入口地址合集

本专题整合了yy漫画入口相关合集,阅读专题下面的文章了解更多详细内容。

99

2026.01.23

漫蛙最新入口地址汇总2026
漫蛙最新入口地址汇总2026

本专题整合了漫蛙最新入口地址大全,阅读专题下面的文章了解更多详细内容。

132

2026.01.23

C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

15

2026.01.23

php远程文件教程合集
php远程文件教程合集

本专题整合了php远程文件相关教程,阅读专题下面的文章了解更多详细内容。

65

2026.01.22

PHP后端开发相关内容汇总
PHP后端开发相关内容汇总

本专题整合了PHP后端开发相关内容,阅读专题下面的文章了解更多详细内容。

61

2026.01.22

php会话教程合集
php会话教程合集

本专题整合了php会话教程相关合集,阅读专题下面的文章了解更多详细内容。

63

2026.01.22

宝塔PHP8.4相关教程汇总
宝塔PHP8.4相关教程汇总

本专题整合了宝塔PHP8.4相关教程,阅读专题下面的文章了解更多详细内容。

33

2026.01.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.7万人学习

Git 教程
Git 教程

共21课时 | 3万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号