CPU 与调度60 条

top 中 CPU 各项含义

CPU 行的 %us/%sy/%wa/%hi/%si/%st 等字段:分别对应用户态、内核态、I/O 等待、硬中断、软中断与虚拟化窃取。

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 设置
%waCPU 空闲但有未完成 I/O 的时间结合 iostat 看设备利用率,注意它不代表磁盘一定慢
%hi 与 %si硬中断与软中断处理时间网卡收包与中断分布问题,看 /proc/softirqs 与中断亲和性
%st被虚拟化层占用的时间云主机超卖信号,长期偏高要找厂商核对规格
%id空闲时间占比与其它字段互补,确认采样是否覆盖了真实高峰
%wa 的解释容易过头:它表示 CPU 空闲且系统尚有未完成的磁盘 I/O,并不直接说明磁盘慢。内核文档也明确指出 iowait 不是可靠的性能瓶颈指标。判断存储是否瓶颈,要看 iostat 的设备利用率与 await、以及应用实际感受到的延迟。
%si 长期偏高而 %sy 不高,通常指向网络收包路径:大量小包、网卡多队列未开启或中断集中在同一颗核上都会出现这种情况。此时调内核参数收效有限,先看网卡队列与中断绑核配置。
%st 是虚拟化环境特有的字段:物理机上它恒为 0。云主机上哪怕几个百分点也值得关注,因为它意味着分配给实例的 CPU 时间被宿主机挪用了,应用侧表现为莫名其妙的延迟抖动而不是资源耗尽。
top 的百分比来自两次采样之间的累计计数差值,第一次输出可能不准确;脚本化采集建议用批处理模式跑两轮取第二轮,或直接用 mpstat、pidstat 这类带明确间隔参数的工具。

易错点

  • 只看汇总不看逐核:单核打满、软中断集中在单核的问题会被平均掉,按 1 展开才能看到
  • 把 %wa 高直接等同于磁盘慢:它只说明有未完成 I/O,必须用 iostat 与业务延迟交叉验证
  • 在容器里用宿主可见的百分比估算自身配额:应结合 cgroup 的 cpu.stat 与cpu.max 来看
  • 忽略 %st 去反复优化应用:实例被宿主窃取的时间无法在实例内解决,需要与平台侧核对
  • 拿第一次采样结果下结论:首次输出的差分基准不可靠,至少采集两轮再判断

数据来源与参考

  • man 1 top
  • man 1 mpstat(sysstat)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌