top 的 CPU 行是什么
top 顶部 Cpu(s) 那一行把 CPU 时间按用途拆成若干百分比,数据来自 /proc/stat 的累计计数差分。读它的要点是先分清「谁在吃 CPU」:用户态程序、内核态系统调用、硬中断、软中断,还是被虚拟化层拿走的时间。默认显示的是所有核的汇总值,按 1 可以展开成逐核视图;只有逐核看才能发现单核打满、中断集中在一颗核上这类问题。
基本信息
| 数据来源 | /proc/stat 的 cpu 与 cpuN 累计计数,top 自行差分 |
|---|---|
| 显示粒度 | 默认全核汇总,按 1 切换为逐核视图 |
| 常用字段 | us 用户态、sy 内核态、ni 调整过优先级的用户态、id 空闲 |
| 等待与中断 | wa 等待 I/O、hi 硬中断、si 软中断、st 被虚拟化层窃取 |
| 配套命令 | mpstat -P ALL 做逐核采样,pidstat 定位具体进程 |
| 采样建议 | 批处理模式 top -bn1 -o %CPU 便于脚本记录与对比 |
典型使用场景
- 快速定位 CPU 消耗类型:us 高查业务逻辑、sy 高查系统调用与上下文切换
- 排查网络吞吐上不去:si 偏高的同时软中断集中在单核,通常是网卡中断未分散
- 云主机性能不达标:st 长期偏高说明宿主超卖或邻居干扰,需要与云厂商核对
- 存储相关卡顿:wa 偏高时配合 iostat 判断是设备瓶颈还是文件系统行为
- 容量评估:按核数归一化后统计高峰期各字段占比,作为扩容与选型的依据
查看与交叉验证
查看与交叉验证
top -bn1 | head -12 # 批处理模式抓一次快照,便于记录
top # 交互模式,按 1 展开逐核,按 P 按 CPU 排序
mpstat -P ALL 1 3 # 逐核采样,确认是否单核打满
pidstat -u 1 3 # 进程级 CPU 占用
cat /proc/softirqs # 各核软中断计数,判断是否分布不均
nproc # 核数,用于把百分比换算成实际算力CPU 行字段读法
| 字段 | 含义 | 偏高时的排查方向 |
|---|---|---|
| %us | 用户态 CPU 时间占比 | 业务计算密集,看进程级排行与算法热点 |
| %sy | 内核态 CPU 时间占比 | 系统调用频繁、锁竞争、上下文切换,配合 pidstat -w 看 |
| %ni | 被调整过 nice 的用户态时间 | 有任务被显式降优先级,核对是否有遗留的 nice 设置 |
| %wa | CPU 空闲但有未完成 I/O 的时间 | 结合 iostat 看设备利用率,注意它不代表磁盘一定慢 |
| %hi 与 %si | 硬中断与软中断处理时间 | 网卡收包与中断分布问题,看 /proc/softirqs 与中断亲和性 |
| %st | 被虚拟化层占用的时间 | 云主机超卖信号,长期偏高要找厂商核对规格 |
| %id | 空闲时间占比 | 与其它字段互补,确认采样是否覆盖了真实高峰 |
%wa 的解释容易过头:它表示 CPU 空闲且系统尚有未完成的磁盘 I/O,并不直接说明磁盘慢。内核文档也明确指出 iowait 不是可靠的性能瓶颈指标。判断存储是否瓶颈,要看 iostat 的设备利用率与 await、以及应用实际感受到的延迟。
%si 长期偏高而 %sy 不高,通常指向网络收包路径:大量小包、网卡多队列未开启或中断集中在同一颗核上都会出现这种情况。此时调内核参数收效有限,先看网卡队列与中断绑核配置。
%st 是虚拟化环境特有的字段:物理机上它恒为 0。云主机上哪怕几个百分点也值得关注,因为它意味着分配给实例的 CPU 时间被宿主机挪用了,应用侧表现为莫名其妙的延迟抖动而不是资源耗尽。
top 的百分比来自两次采样之间的累计计数差值,第一次输出可能不准确;脚本化采集建议用批处理模式跑两轮取第二轮,或直接用 mpstat、pidstat 这类带明确间隔参数的工具。