CPU 使用率怎么计算?读 /proc/stat 的 jiffies 增量
答案:CPU 使用率 = 忙碌 CPU 时间增量 / 总 CPU 时间增量。数据来源是 /proc/stat(系统)与 /proc/PID/stat(进程)里的 jiffies 计数,两次采样做差值计算。
系统 CPU 使用率(手算示例)
# 连续读两次 /proc/stat 的 cpu 行
grep '^cpu ' /proc/stat
# cpu user nice system idle iowait irq softirq steal guest
# 两次采样后:
# 忙碌增量 = Δ(user+nice+system+irq+softirq+steal)
# 总增量 = Δ(user+nice+system+idle+iowait+irq+softirq+steal)
# 使用率 = 忙碌增量 / 总增量 × 100%要点:单位是 jiffies(USER_HZ,通常 100,即每 10ms 一 tick);必须两次采样做差值,不能只看绝对值。
进程 CPU 使用率(手算示例)
# /proc/PID/stat 第 14、15 字段:utime、stime(jiffies)
awk '{print $14, $15}' /proc/<PID>/stat
# 使用率 = (Δutime + Δstime) / (采样间隔秒 × 100) × 100%常见坑
- top 的 %CPU 未归一化:多核下 2 核满负荷显示 200%,不是 bug;
- top 是"刷新周期平均":默认 3 秒,不是瞬时值;
- iowait 算不算忙碌:看口径——通常不算(CPU 在等 IO),算"非空闲"时则计入;
- 时钟频率:
getconf CLK_TCK确认每秒 jiffies,别写死 100。
现成命令(不用手算)
| 命令 | 看什么 |
|---|---|
top / htop | 整体 + 进程,默认 3 秒刷新 |
mpstat -P ALL 1 | 每个 CPU 核分别的使用率 |
pidstat 1 | 按进程实时统计 |
sar -u 1 | 记录历史,回头看峰值 |
vmstat 1 | us/sy 快捷总览 |
深度入口
FAQ
Q: CPU 使用率怎么计算? A: 从 /proc/stat 取两帧 jiffies(user+system+...),使用率 = (本帧忙碌增量 / 本帧总增量) × 100%;进程使用率用 /proc/PID/stat 的 utime+stime。
Q: /proc/stat 里各列代表什么? A: cpu 行依次是 user、nice、system、idle、iowait、irq、softirq、steal、guest。忙碌 = 总 - idle(+iowait 按需计入)。
Q: top 里的 CPU 使用率是瞬时值吗? A: 不是瞬时,是自上次刷新以来的平均增量。top 默认 3 秒刷新,显示的是这段时间内的平均使用率;采样间隔太短会抖动。
Q: 为什么多核 CPU 使用率会超过 100%? A: top 的 %CPU 是按核数归一化前的值,多核下每个核最多 100%,2 核满负荷显示 200%。这是正常的。
Q: 进程 CPU 使用率怎么算? A: 进程 CPU 时间 = /proc/PID/stat 的 utime+stime(jiffies),使用率 = 两帧差值 / (采样间隔 × 每秒时钟数) × 100%。
Q: 怎么用命令直接看 CPU 使用率? A: top/htop 看整体与进程;mpstat -P ALL 1 看每核;pidstat 1 看进程;sar -u 1 记录历史;vmstat 1 看 us/sy 列。
一句话总结:CPU 使用率 = 忙碌 jiffies 增量 ÷ 总 jiffies 增量;系统看 /proc/stat、进程看 /proc/PID/stat,两次采样做差值,top/mpstat/pidstat 就是帮你干这件事的命令。