Linux下计算CPU使用率和进程CPU占用
1.Linux下CPU使用率计算
1.1 获取CPU相关数据
CPU相关的数据都存储在/proc/stat文件下
复制cat /proc/stat
可以获取的数据如下所示
cpu 6001763 384590 1904835 211700174 157342 0 63444 0 0 0 cpu0 521999 27988 157444 17621608 11005 0 3532 0 0 0 cpu1 513452 31008 159755 17616935 10683 0 5240 0 0 0 cpu2 530440 34565 159890 17616829 10429 0 4742 0 0 0 cpu3 519640 29076 169149 17621506 9726 0 7541 0 0 0 cpu4 514370 34605 161789 17631065 12992 0 4708 0 0 0 cpu5 523942 36103 166402 17622435 12309 0 2815 0 0 0 cpu6 468207 28426 153570 17660385 15094 0 12511 0 0 0 cpu7 494163 44118 153420 17639615 17222 0 3442 0 0 0 cpu8 468937 29524 151972 17679989 15310 0 3860 0 0 0 cpu9 486031 26383 151794 17674017 15065 0 2664 0 0 0 cpu10 479509 30625 155559 17673558 12349 0 2450 0 0 0 cpu11 481070 32163 164086 17642227 15152 0 9936 0 0 0 ......
对于CPU使用率的计算,我们需要关注第一行,即
cpu 6001763 384590 1904835 211700174 157342 0 63444 0 0 0
上述一行中的每个数值单位都是jiffies[1]
分析上述文本,从左到右的文本依次表示
- user(6001763) 从系统启动开始累积到当前时刻,处于用户态的运行时间,不包含 nice 值为负的进程。
- nice(384590) 从系统启动开始累积到当前时刻,nice 值为负的进程所占用的 CPU 时间。
- system(1904835) 从系统启动开始累积到当前时刻,处于核心态的运行时间。
- idle(211700174) 从系统启动开始累积到当前时刻,除 IO 等待时间以外的其他等待时间。
- iowait(157342) 从系统启动开始累积到当前时刻,IO 等待时间。(since 2.5.41)
- irq(0) 从系统启动开始累积到当前时刻,硬中断时间。(since 2.6.0-test4)
- softirq(63444) 从系统启动开始累积到当前时刻,软中断时间。(since 2.6.0-test4)
- stealstolen(0) Which is the time spent in other operating systems when running in a virtualized environment.(since 2.6.11)
- guest(0) Which is the time spent running a virtual CPU for guest operating systems under the control of the Linux kernel.(since 2.6.24)
- guestnice(0)
通过以上数值,可以获得系统启动开始,CPU总的活动时间[2]totalCPUTime为:
CPU总的空闲时间idleCPUTime为:
在C++中,可以通过以下代码计算得到jiffies的值:
#include <unistd.h> uint16_t cpu_hz = sysconf(_SC_CLK_TCK); uint16_t jiffies = 1000 / cpu_hz;
1.2 任意时间间隔计算CPU使用率
- 假设读取两次/proc/stat文件,可以获取两个不同的totalCPUTime,记为totalCPUTime0和totalCPUTime1
- 同样的,可以得到idleCPUTime0和idleCPUTime1
- 记deltaTotalCPUtime为totalCPUTime1和totalCPUTime0的差值
- 记deltaIdleCPUTime为idleCPUTime1和idleCPUTime0的差值
那么,可以计算得到这两次读取之间CPU的使用率[3]:
2.Linux下进程的CPU使用率计算
2.1 获取进程的CPU相关数据
不同pid的进程相关的数据,都存储在/proc/${pid}/stat文件下
cat /proc/${pid}/stat
以pid为5995的进程为例
cat /proc/5995/stat
获取的数据如下所示
5995 (gnome-terminal-) S 4128 5995 5995 0 -1 4194304 26845 4629217 403 404 79290 9349 12450 16636 20 0 5 0 12069 950829056 21731 ......
其中,前13项参数与进程CPU使用率计算无关,无需关注
- utime=79290 该任务在用户态运行的时间,单位为jiffies
- stime=9349 该任务在核心态运行的时间,单位为jiffies
- cutime=12450 累计的该任务的所有的waited-for进程曾经在用户态运行的时间,单位为jiffies
- cstime=16636 累计的该任务的所有的waited-for进程曾经在核心态运行的时间,单位为jiffies
2.2 任意时间间隔计算进程的CPU使用率
通过计算可以得到进程CPU累计运行时间为:
通过两次读取/proc/${pid}/stat文件,可以得到两次间隔之间,进程CPU累计的运行时间:
根据1.1中计算deltaTotalCPUtime的方式,获取deltaTotalCPUtime的值
假设CPU核心数为n,那么可以得到进程的CPU使用率为:
2.3 固定时间间隔计算进程的CPU使用率
假设应用程序以clock的时间间隔循环执行,通过两次运行可以得到进程CPU的差值为deltaTotalProcCPUtime
那么可以得到进程的CPU使用率为:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!