CentOS 上使用 cpustat 识别 CPU 性能瓶颈的实用技巧
一 工具选择与安装
- 在 CentOS 上常见的“cpustat”主要有两类,请先确认你安装的是哪一个,以免命令与输出含义不一致:
- Uber 的 cpustat(Go 版):侧重按进程/线程汇总 CPU 占用,适合快速找出“谁在吃 CPU”。安装示例:先装 Go,再执行 go get github.com/uber-common/cpustat;常用:sudo cpustat、sudo cpustat -p 。输出包含 %usr、%sys、%idle、iowait、hi、si、st 等字段。
- sysstat 套件中的 cpustat:与 sar/mpstat 同源,侧重系统级 CPU 时间分布与历史统计。安装:sudo yum install -y sysstat;常用:cpustat、cpustat -o cpu_usage.csv 1 10(每秒一次、共 10 次,导出 CSV 便于复盘)。
二 快速判别瓶颈的信号
- 使用 Uber 版 cpustat 观察整体:
- %usr 或 %sys 持续很高、%idle 很低:CPU 计算/内核消耗成为主因;若 %sys 偏高,常见于系统调用密集、驱动/内核路径繁忙。
- iowait(或 wa)高:CPU 大量时间在等 I/O,磁盘/存储往往是根因,应联动 I/O 工具进一步确认。
- hi/si 高:硬件/软件中断风暴,可能来自网卡、存储或定时器等;需结合中断与软中断分布定位来源。
- 单核长期打满、其他核空闲:线程/进程未充分并行或存在锁争用,需做亲和性与并发度优化。
- 使用 sysstat 版 cpustat 或结合 mpstat/vmstat 校验:
- %idle 低且 %sys 高:偏向内核态瓶颈(系统调用、锁、页分配、中断等)。
- 运行队列(vmstat 的 r)长期大于逻辑 CPU 数:CPU 饱和,任务排队等待。
- 上下文切换(vmstat 的 cs)与中断(in)异常高:调度/中断过于频繁,常见于线程过多或中断集中。
三 高效排查流程
- 全局快检:运行 cpustat(Uber 版)观察数轮输出,先看 %idle、%usr、%sys、iowait、hi/si 的走向与峰值分布。
- 定位“谁”在耗 CPU:
- 用 cpustat -p 聚焦问题进程;或用 top/htop 按 CPU 排序确认 Top-N 进程。
- 判断瓶颈类型:
- 若 iowait 高:转用 iostat -x 1 查看磁盘 util%、await、svctm、r/s、w/s,确认是否为存储瓶颈。
- 若 %sys 高:用 vmstat 1 看 r、cs、si,用 mpstat -P ALL 1 看各核是否均衡,必要时结合 pidstat -w 区分自愿/非自愿上下文切换。
- 若 hi/si 高:查看 /proc/interrupts、/proc/softirqs 按 CPU 与类型定位来源(如 NET_RX/TIMER 等)。
- 复核负载与并行度:
- 用 uptime 看 load average 与逻辑 CPU 数的关系;若负载高于核数且 r 高,说明 CPU 饱和。
- 检查是否单核长期高占用,考虑调整线程池/并发、绑定 CPU 亲和性(taskset)、优化锁与热点路径。
- 留存证据与复盘:
- 用 sysstat 版 cpustat 导出 CSV(如 -o cpu_usage.csv 1 60),便于画图与回溯;必要时配合 sar 查看历史。
四 常用命令速查表
| 场景 |
命令示例 |
关注点 |
| 安装 Uber 版 cpustat |
sudo yum install -y golang && go get github.com/uber-common/cpustat |
安装 Go 后获取工具 |
| 实时监控(Uber) |
sudo cpustat |
快速扫全局:%usr、%sys、%idle、iowait、hi、si |
| 按进程查看(Uber) |
sudo cpustat -p |
定位具体进程/线程 |
| 安装 sysstat 版 cpustat |
sudo yum install -y sysstat |
系统级统计与历史 |
| 采样并导出 CSV |
cpustat -o cpu_usage.csv 1 60 |
便于分析与复盘 |
| 每核使用率 |
mpstat -P ALL 1 |
发现单核打满/不均衡 |
| 运行队列与上下文切换 |
vmstat 1 |
r、cs、si、b 等 |
| 磁盘 I/O 佐证 |
iostat -x 1 |
%util、await、svctm、r/s、w/s |
| 历史回看 |
sar -f /var/log/sysstat/saXX |
回放当天或指定日期数据 |
五 易错点与优化建议
- 不要把 CPU 利用率 与 平均负载 混为一谈:load average 是平均活跃任务数,需结合 逻辑 CPU 数 与 r 队列判断饱和。
- iowait 高 ≠ 磁盘一定慢:也可能是文件系统、驱动或队列策略问题;务必用 iostat 交叉验证。
- %sys 高 常见于系统调用风暴、锁竞争、页分配/回收频繁;结合 mpstat/vmstat/pidstat 细化到调用路径与线程。
- hi/si 高 需按 CPU 与软中断类型定位(如网络收包 NET_RX);必要时调整驱动/中断亲和性或优化网络栈。
- 单核长期高占用 多为并行度不足或热点锁;考虑增加并发、减少锁争用、使用 CPU 亲和性与绑核策略。
- 做长期观测时,优先使用 sysstat 版 cpustat 导出 CSV 或 sar 做趋势分析,避免仅凭瞬时截图下结论。