LinuxNotes

第 20 章:性能分析工具

zjc 于 2026-01-20 发布

这是《Linux 零基础实战指南》的独立章节版。本章从概念、实操和生产排查三个视角展开,代码块保留了原书可直接运行的版本。 性能分析不是收集所有数据,而是根据假设选择证据。Linux 提供 uptime、vmstat、pidstat、iostat、perf、strace、bcc 和火焰图等工具。关键是建立从现象到瓶颈的分析路径。

20.1 USE 方法

对每类资源检查:

检查项 含义
Utilization 使用率
Saturation 饱和度或排队
Errors 错误

示例:

资源 Utilization Saturation Errors
CPU us/sy/id runq、throttle machine check
内存 available swap、reclaim OOM
IO util、带宽 await、aqu-sz IO error
网络 带宽、PPS drops、retrans CRC、RST

20.2 第一分钟巡检

uptime
df -hT
free -h
dmesg -T | tail -50
systemctl --failed --no-pager
ss -s

进程:

ps -eo pid,user,stat,%cpu,%mem,rss,etime,cmd \
  --sort=-%cpu | head -20
ps -eo pid,user,stat,%cpu,%mem,rss,etime,cmd \
  --sort=-rss | head -20

IO 与 CPU:

vmstat 1 5
iostat -xz 1 5

20.3 vmstat

vmstat 1 10

关键字段:

字段 含义
r 可运行进程
b 不可中断进程
swpd swap 使用
free 空闲内存
buff/cache 缓存
si / so swap 换入换出
bi / bo 块设备读写
us / sy / id / wa / st CPU 分布

判断:

r 持续大于 CPU 数 -> CPU 饱和
b 持续高 -> IO 等待
si/so 持续 -> 内存压力
wa 高 -> IO 压力
st 高 -> 虚拟化抢占

20.4 pidstat

安装:

sudo apt install sysstat
sudo dnf install sysstat

CPU:

pidstat -u 1
pidstat -u -p <pid> 1

内存:

pidstat -r 1

IO:

pidstat -d 1

线程:

pidstat -t -p <pid> 1

上下文切换:

pidstat -w 1

20.5 strace

strace -p <pid>
strace -c -p <pid>
strace -T -e trace=file,network -p <pid>

常见场景:

场景 过滤
找不到配置 trace=file
网络异常 trace=network
进程卡住 查看当前阻塞系统调用
系统调用开销 -c 统计

strace 有明显性能开销,不要在高流量生产进程上长期附着。

20.6 lsof 与 /proc

lsof -nP -p <pid>
lsof +L1
lsof -nP -iTCP -sTCP:LISTEN

/proc

cat /proc/<pid>/status
cat /proc/<pid>/io
cat /proc/<pid>/limits
tr '\0' '\n' < /proc/<pid>/environ
readlink -f /proc/<pid>/cwd

适合在不安装工具的机器上快速取证。

20.7 perf

统计:

perf stat -p <pid> -- sleep 10

采样:

sudo perf record -F 99 -g -p <pid> -- sleep 30
sudo perf report --stdio

内核符号:

sudo perf report --kallsyms /proc/kallsyms

常见输出:

指标 含义
task-clock 任务运行时间
context-switches 上下文切换
cpu-migrations CPU 迁移
page-faults 缺页
cycles CPU 周期
instructions 指令数
IPC 指令 / 周期

20.8 火焰图

安装 FlameGraph:

git clone https://github.com/brendangregg/FlameGraph.git

生成:

sudo perf record -F 99 -g -p <pid> -- sleep 30
sudo perf script > perf.script
FlameGraph/stackcollapse-perf.pl perf.script > perf.folded
FlameGraph/flamegraph.pl perf.folded > flame.svg

解读:

  1. 宽度代表样本占比;
  2. 栈深代表调用层级;
  3. 关注最宽的业务或系统路径;
  4. 区分 on-CPU 和 off-CPU;
  5. 保留符号和二进制版本。

20.9 eBPF / bcc

sudo execsnoop
sudo opensnoop
sudo biolatency 10 1
sudo tcpretrans
sudo runqlat

适用:

  1. 新进程追踪;
  2. IO 延迟分布;
  3. TCP 重传;
  4. 调度延迟;
  5. 内核与用户态联合观测。

需要内核版本、权限和 BTF 支持。容器环境可能受安全策略限制。

20.10 性能分析流程

1. 明确现象和影响面
2. 确认近期变更
3. 看黄金指标:延迟、流量、错误、饱和度
4. 判断资源:CPU、内存、IO、网络
5. 定位进程和线程
6. 进入运行时内部栈
7. 提出假设并验证
8. 小流量或回滚验证效果
9. 记录指标和结论

不要跳过基线。没有延迟分布和对比版本,很难证明“变慢”。

20.11 报告模板

## 问题
- 现象:
- 开始时间:
- 影响范围:

## 基线
- 指标:
- 时间窗口:
- 对比对象:

## 证据
- 系统指标:
- 进程指标:
- 日志:
- trace:
- profile:

## 根因
- 直接原因:
- 促成条件:

## 验证
- 变更:
- 前后指标:
- 回滚:

## 后续
- 监控:
- 容量:
- 优化:

本章小结

性能分析要先建立现象、影响面和基线,再用 USE 方法检查资源,用进程工具定位到具体执行流,最后进入运行时 profile。工具只是证据采集方式,结论必须有前后对比和回滚验证。

思考题

  1. USE 方法的三个检查项是什么?
  2. vmstat 中 b 列高说明什么?
  3. strace 为什么不能随意长期使用?
  4. 火焰图的宽度代表什么?
  5. 设计一次线上延迟升高的排查报告。