4.6.3 常用CPU分析工具与使用方法

在CPU性能分析中,常用工具覆盖“宏观概览—热点定位—调用链追踪—采样对比”多个层次,建议按问题现象选择组合使用。

文章图片

0. 工具安装与基础准备(适用于多数发行版)#

  • 说明:以下工具主要来自 procps-ngsysstatperfgdbstraceltrace 等包。
# RHEL/CentOS/Rocky
sudo yum -y install procps-ng sysstat perf gdb strace ltrace

# Ubuntu/Debian
sudo apt -y install procps sysstat linux-tools-common linux-tools-$(uname -r) gdb strace ltrace
  • 启用历史采集(sar 依赖):
# RHEL/CentOS/Rocky
sudo systemctl enable --now sysstat

# Ubuntu/Debian
sudo systemctl enable --now sysstat

1. top/htop:实时负载与热点进程#

  • 关注指标:load average、%us/%sy/%id/%wa、进程CPU占用、线程数。
  • 常用操作:P按CPU排序、1查看多核、H查看线程。
# 实时查看
top

# 解释:P 排序,1 显示每核,H 显示线程
  • 示例:快速锁定高CPU进程
top -b -n 1 | head -n 20
  • 排错提示:
  • load average 高但 %id 也高:可能阻塞在IO或锁等待,继续用 vmstatpidstat
  • %sy 高:多为系统态占用,检查中断或内核调用。

2. mpstat:按CPU核统计#

  • 命令示例:mpstat -P ALL 1
  • 关注指标:每核%usr/%sys/%iowait/%soft/%steal。
mpstat -P ALL 1
  • 解释:-P ALL 显示所有核,1 每秒刷新。
  • 排错提示:
  • 某个核长期 %usr 高:单核瓶颈,考虑线程亲和或热点函数。
  • %steal 高:虚拟化环境被宿主机抢占。

3. pidstat:进程级CPU与线程级分析#

  • 命令示例:pidstat -u -p <pid> 1pidstat -t -p <pid> 1
# 进程级
pidstat -u -p 12345 1

# 线程级
pidstat -t -p 12345 1
  • 解释:-u CPU,-t 线程,-p 指定PID。
  • 排错提示:
  • 线程级高CPU:记录 TID,再用 pstack/gstackperf 追栈。

4. ps:静态快照与排序分析#

  • 命令示例:
ps -eo pid,ppid,cmd,%cpu,%mem --sort=-%cpu | head
  • 解释:-e 所有进程,-o 定制输出,--sort=-%cpu 按CPU降序。
  • 排错提示:若进程名过长,可加 --cols 200 扩展显示宽度。

5. vmstat:CPU与调度概览#

  • 命令示例:vmstat 1
vmstat 1
  • 关注指标:r(运行队列)、cs(上下文切换)、us/sy/id/wa
  • 排错提示:
  • r 长期 > CPU核数:CPU饱和。
  • cs 过高:可能线程切换频繁或锁争用。

6. sar:历史趋势与基线#

  • 命令示例:
# 实时
sar -u 1 5

# 历史(saXX为当天数据文件)
sar -u -f /var/log/sa/sa$(date +%d)
  • 解释:-u CPU,1 5 表示每秒一次,共5次。
  • 排错提示:
  • 无历史数据:检查 sysstat 是否启用。
  • 时间段对比异常:建议与业务峰谷时段对齐。

7. perf:热点函数与调用栈#

  • 命令示例:
# 在线查看热点
sudo perf top

# 采样并生成报告
sudo perf record -p 12345 -g -- sleep 30
sudo perf report
  • 解释:-p 指定进程,-g 采集调用栈。
  • 排错提示:
  • 符号不可读:安装调试符号包或开启编译符号。
  • 权限不足:使用 sudo 或调整 perf_event_paranoid

8. strace:系统调用层面分析#

  • 命令示例:
sudo strace -p 12345 -c
  • 解释:-c 统计汇总,输出耗时与次数。
  • 排错提示:
  • 对高频进程影响大:缩短跟踪时间或使用 -e trace= 限制系统调用。

9. ltrace:库函数调用分析#

  • 命令示例:
sudo ltrace -p 12345 -c
  • 解释:统计库函数调用次数与耗时,适用于用户态热点初筛。
  • 排错提示:对于静态编译或不使用动态库的程序可能无输出。

10. pstack/gstack:线程堆栈快照#

  • 命令示例:
# pstack
sudo pstack 12345

# gstack(通常随 gdb)
sudo gstack 12345
  • 解释:生成线程调用栈,用于锁等待或卡顿定位。
  • 排错提示:若无输出或权限失败,需检查 ptrace 权限。

11. /proc 与调度器信息#

  • 文件示例与解释:
# CPU总体时间片统计
cat /proc/stat | head -n 5

# 单进程状态
cat /proc/12345/stat

# 中断情况
cat /proc/interrupts | head -n 10
  • 适用场景:脚本化采集与自定义监控。

12. 火焰图(FlameGraph)工具链#

  • 流程:perf recordperf script → FlameGraph
# 1) 采样
sudo perf record -F 99 -p 12345 -g -- sleep 30

# 2) 生成脚本
sudo perf script > /tmp/out.perf

# 3) 生成火焰图(需下载 FlameGraph)
git clone https://github.com/brendangregg/FlameGraph.git
./FlameGraph/stackcollapse-perf.pl /tmp/out.perf > /tmp/out.folded
./FlameGraph/flamegraph.pl /tmp/out.folded > /tmp/flamegraph.svg

# 4) 浏览
ls -l /tmp/flamegraph.svg
  • 预期效果:得到可视化SVG,宽度代表CPU占比,纵向为调用栈深度。

使用建议与组合策略(带示例)#

  • 快速定位:top/htop + pidstat + mpstat
top -b -n 1 | head
pidstat -u -p 12345 1 3
mpstat -P ALL 1 3
  • 过程分析:vmstat + sar(趋势)
vmstat 1 5
sar -u -f /var/log/sa/sa$(date +%d)
  • 深度剖析:perf + 火焰图

常见问题排查清单#

  1. perf 无法采样
    - 检查内核参数:
cat /proc/sys/kernel/perf_event_paranoid
# 建议值 <= 2,必要时临时调整:
sudo sysctl -w kernel.perf_event_paranoid=1
  1. sar 无历史数据
    - 检查服务:
systemctl status sysstat
  1. pstack/gstack 报 ptrace 权限
    - 检查:
cat /proc/sys/kernel/yama/ptrace_scope
# 必要时降低限制
sudo sysctl -w kernel.yama.ptrace_scope=0

练习#

  1. 负载对比练习
    - 用 stress 制造CPU压力并对比工具输出:
# 安装(Ubuntu/Debian)
sudo apt -y install stress

# 制造 2 核 CPU 压力 60 秒
stress --cpu 2 --timeout 60

# 观察
top
mpstat -P ALL 1
  1. 线程热点定位练习
    - 找到高CPU线程并输出堆栈:
pidstat -t -p 12345 1
# 记录高CPU线程TID后
pstack 12345 | less
  1. 生成火焰图练习
    - 对某进程采样并生成SVG,确认文件可打开:
sudo perf record -F 99 -p 12345 -g -- sleep 10
sudo perf script > /tmp/out.perf
./FlameGraph/stackcollapse-perf.pl /tmp/out.perf > /tmp/out.folded
./FlameGraph/flamegraph.pl /tmp/out.folded > /tmp/flamegraph.svg