在 CentOS 上分析 CPU 瓶颈,cpustat 不是系统默认工具,通常有两种理解方式:
mpstat / sar / top / vmstat 等工具(最常见)cpustat(如 sysstat 包或 performance tools 里的)下面我按实战排查思路来讲,重点放在 如何判断 CPU 瓶颈,而不只是看数字。
top
关注点:
us:用户态 CPU(应用)sy:内核态 CPU(系统调用、中断)wa:IO 等待(⚠️ 不等于 CPU 瓶颈)id:空闲示例:
%Cpu(s): 85.2 us, 10.3 sy, 0.0 ni, 4.5 id, 0.0 wa
✅ 说明 CPU 主要被用户进程吃掉,可能是业务逻辑问题
mpstat -P ALL 1
重点看:
sys 是否异常高irq / softirq示例(异常):
%usr %sys %iowait
90 10 0
✅ 用户态 CPU 飙高 → 应用问题
%usr %sys %iowait
20 60 0
✅ 内核态高 → 系统调用 / 锁 / 驱动问题
vmstat 1
关键列:
r:运行队列(> CPU 核数 = 瓶颈)us / sywa(IO 等待)cs(上下文切换)示例瓶颈:
r b swpd free buff cache si so bi bo in cs us sy id wa st
12 0 0 100M 0 0 0 0 0 0 1000 5000 80 20 0 0 0
✅ r > CPU 核数 是 CPU 瓶颈最可靠指标之一
cpustatsysstat 包cpustat 来自 perf-tools / osquery / 第三方工具示例:
cpustat 1
通常输出:
分析思路与 mpstat 一样。
| 现象 | 是否 CPU 瓶颈 |
|---|---|
| %user 高 | ✅ 很可能是 |
| %system 异常高 | ✅ 内核 / 锁 / 中断 |
| load > CPU 核数 | ✅ |
vmstat r 持续高 |
✅ |
| %iowait 高 | ❌ 多半是磁盘 |
| 内存 swap 高 | ❌ 内存瓶颈 |
top -H -p <pid>
jstack <pid> > stack.txt
go tool pprof http://localhost:6060/debug/pprof/profile
可能原因:
排查:
perf top
常见输出:
futex → 锁schedule → 上下文切换vmstat 1
cs 很高
原因:
top
# 看 us / sy / wa / load
vmstat 1
# 看 r / cs
mpstat -P ALL 1
# 看单核是否跑满
perf top
# 找热点函数
CPU 瓶颈 ≠ CPU 使用率高
真正瓶颈 = 有任务在等 CPU(run queue)
如果你愿意,可以把 top / vmstat / mpstat 的实际输出贴出来,我可以直接帮你判断是哪一种瓶颈,以及下一步怎么优化。