首页/系统/Linux 内核与性能调优速查//proc/stat 累计计数解读
CPU 与调度60 条

/proc/stat 累计计数解读

内核累计统计:每核 cpuN 行的 user/nice/system/idle/iowait/irq/softirq/steal,以及 ctxt、processes 等汇总计数。

/proc/stat 是什么

/proc/stat 是内核的累计统计快照:cpu 汇总行与 cpuN 每核行给出各用途的 CPU 时间(单位为用户态抖动 ticks),此外还有 ctxt、processes、procs_running 等系统级计数。它是 top、vmstat、sar 以及各类监控采集器的共同数据源。这些值都是开机以来的累计量,单次读取没有意义,必须取两个时间点作差、再除以间隔才能换算成速率。

基本信息

关键行cpu 汇总行与 cpuN 每核行
CPU 列user nice system idle iowait irq softirq steal 等
系统计数ctxt 上下文切换累计、processes 进程创建累计
队列相关procs_running 与 procs_blocked
单位CPU 时间以 USER_HZ 为单位,通常每秒 100 个刻度
使用方式两次采样作差换算速率,间隔过小会被统计粒度误差影响

典型使用场景

  • 自建监控采集:希望不依赖 top 或 sar,直接从内核拿到原始计数
  • 核对监控数据:怀疑监控平台数值异常时,回到源头确认原始计数
  • 排查 steal 时间:确认虚拟化环境下被宿主占用的算力比例
  • 分析中断负载:对比 irq 与 softirq 两组计数判断中断压力来源
  • 进程创建风暴:观察 processes 计数增速判断是否存在频繁 fork

查看与换算

查看与换算
head -3 /proc/stat                          # 汇总行与逐核行
grep -E '^ctxt|^processes|^procs_running|^procs_blocked' /proc/stat
nproc                                       # 核数,用于逐核数值归一化
# 换算速率示例:两次读取同一字段,作差再除以采样间隔
awk '/^ctxt/{print $2}' /proc/stat; sleep 5; awk '/^ctxt/{print $2}' /proc/stat

字段读法

字段含义判读要点
cpu 汇总行所有核合计的各用途时间适合看整体趋势,单核问题会被平均
cpuN 行第 N 颗核的时间统计逐核比较可发现单核打满或中断集中
ctxt上下文切换累计次数作差换算速率,与 vmstat 的 cs 对应
processes进程创建累计次数增速异常说明存在频繁创建进程的行为
procs_blocked阻塞在 I/O 上的任务数长期不为零说明存储侧存在压力
累计值必须作差,而且采样间隔不宜过短:间隔小于统计更新粒度时,两次读取可能取到同一批计数,换算结果会出现零值或跳变。通用做法是间隔一秒以上连续采样。
steal 时间在虚拟机上不可忽略,它代表被虚拟化层拿走的 CPU 时间。做容量评估时应把它从可用算力里扣除,否则会高估实例的真实处理能力。

易错点

  • 直接读累计值下结论:未作差的数字无法反映当前状态,换算成速率才有意义
  • 采样间隔过短:统计粒度误差会放大,出现零值或异常跳变
  • 只看汇总行:单核打满与中断集中会被平均值掩盖
  • 忽略 steal 字段:虚拟化环境下的可用算力被高估,容量规划随之失真
  • 把 /proc/stat 的数值与监控平台的展示口径混用:不同工具的单位与归一化方式可能不同

数据来源与参考

  • man 5 proc(/proc/stat)
  • Linux 内核 Documentation/filesystems/proc.rst
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌