如何通过时间片差值公式实时监测进程CPU使用率?
- 内容介绍
- 文章标签
- 相关推荐
本文共计860个文字,预计阅读时间需要4分钟。
由于这两个值是进程累积消耗的用户态/内核态时钟周期(单位是CLK_TCK,通常为+100),而不是百分比。要将其转换为CPU利用率,需要计算时间窗口内的差值,并将其归一化到系统总可用时间片上。跳过这一步直接相减会忽略采样间隔,导致结果严重失真——在多核处理器上,100%可能被错误地计算为400%。
核心公式:两步差值 + 归一化
真实 CPU 使用率 = (Δutime + Δstime) / (Δtotal_jiffies * num_cpus) × 100%
-
Δutime、Δstime:两次采样间/proc/[pid]/stat第 14、15 字段的差值 -
Δtotal_jiffies:两次采样时间间隔(秒)×sysconf(_SC_CLK_TCK),即该时间段内系统理论上可分配的最大时间片数 -
num_cpus:用sysconf(_SC_NPROCESSORS_ONLN)获取在线 CPU 核心数,不能硬编码为 1 或 4
注意:/proc/[pid]/stat 中第 22 字段 cutime/cstime 是子进程数据,实时监控单进程时不要混入。
代码里怎么安全读取并解析 /proc/[pid]/stat
字段数量不固定(因命令行参数含空格),不能靠 sscanf 简单按位置取。
本文共计860个文字,预计阅读时间需要4分钟。
由于这两个值是进程累积消耗的用户态/内核态时钟周期(单位是CLK_TCK,通常为+100),而不是百分比。要将其转换为CPU利用率,需要计算时间窗口内的差值,并将其归一化到系统总可用时间片上。跳过这一步直接相减会忽略采样间隔,导致结果严重失真——在多核处理器上,100%可能被错误地计算为400%。
核心公式:两步差值 + 归一化
真实 CPU 使用率 = (Δutime + Δstime) / (Δtotal_jiffies * num_cpus) × 100%
-
Δutime、Δstime:两次采样间/proc/[pid]/stat第 14、15 字段的差值 -
Δtotal_jiffies:两次采样时间间隔(秒)×sysconf(_SC_CLK_TCK),即该时间段内系统理论上可分配的最大时间片数 -
num_cpus:用sysconf(_SC_NPROCESSORS_ONLN)获取在线 CPU 核心数,不能硬编码为 1 或 4
注意:/proc/[pid]/stat 中第 22 字段 cutime/cstime 是子进程数据,实时监控单进程时不要混入。
代码里怎么安全读取并解析 /proc/[pid]/stat
字段数量不固定(因命令行参数含空格),不能靠 sscanf 简单按位置取。

