/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 时间。做容量评估时应把它从可用算力里扣除,否则会高估实例的真实处理能力。