4.6.3 常用CPU分析工具与使用方法
在CPU性能分析中,常用工具覆盖“宏观概览—热点定位—调用链追踪—采样对比”多个层次,建议按问题现象选择组合使用。
0. 工具安装与基础准备(适用于多数发行版)#
- 说明:以下工具主要来自
procps-ng、sysstat、perf、gdb、strace、ltrace等包。
# 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或锁等待,继续用
vmstat、pidstat。 - %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> 1、pidstat -t -p <pid> 1
# 进程级
pidstat -u -p 12345 1
# 线程级
pidstat -t -p 12345 1
- 解释:
-uCPU,-t线程,-p指定PID。 - 排错提示:
- 线程级高CPU:记录
TID,再用pstack/gstack或perf追栈。
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)
- 解释:
-uCPU,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 record→perf 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 + 火焰图
常见问题排查清单#
- perf 无法采样
- 检查内核参数:
cat /proc/sys/kernel/perf_event_paranoid
# 建议值 <= 2,必要时临时调整:
sudo sysctl -w kernel.perf_event_paranoid=1
- sar 无历史数据
- 检查服务:
systemctl status sysstat
- pstack/gstack 报 ptrace 权限
- 检查:
cat /proc/sys/kernel/yama/ptrace_scope
# 必要时降低限制
sudo sysctl -w kernel.yama.ptrace_scope=0
练习#
- 负载对比练习
- 用stress制造CPU压力并对比工具输出:
# 安装(Ubuntu/Debian)
sudo apt -y install stress
# 制造 2 核 CPU 压力 60 秒
stress --cpu 2 --timeout 60
# 观察
top
mpstat -P ALL 1
- 线程热点定位练习
- 找到高CPU线程并输出堆栈:
pidstat -t -p 12345 1
# 记录高CPU线程TID后
pstack 12345 | less
- 生成火焰图练习
- 对某进程采样并生成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