这是《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
解读:
- 宽度代表样本占比;
- 栈深代表调用层级;
- 关注最宽的业务或系统路径;
- 区分 on-CPU 和 off-CPU;
- 保留符号和二进制版本。
20.9 eBPF / bcc
sudo execsnoop
sudo opensnoop
sudo biolatency 10 1
sudo tcpretrans
sudo runqlat
适用:
- 新进程追踪;
- IO 延迟分布;
- TCP 重传;
- 调度延迟;
- 内核与用户态联合观测。
需要内核版本、权限和 BTF 支持。容器环境可能受安全策略限制。
20.10 性能分析流程
1. 明确现象和影响面
2. 确认近期变更
3. 看黄金指标:延迟、流量、错误、饱和度
4. 判断资源:CPU、内存、IO、网络
5. 定位进程和线程
6. 进入运行时内部栈
7. 提出假设并验证
8. 小流量或回滚验证效果
9. 记录指标和结论
不要跳过基线。没有延迟分布和对比版本,很难证明“变慢”。
20.11 报告模板
## 问题
- 现象:
- 开始时间:
- 影响范围:
## 基线
- 指标:
- 时间窗口:
- 对比对象:
## 证据
- 系统指标:
- 进程指标:
- 日志:
- trace:
- profile:
## 根因
- 直接原因:
- 促成条件:
## 验证
- 变更:
- 前后指标:
- 回滚:
## 后续
- 监控:
- 容量:
- 优化:
本章小结
性能分析要先建立现象、影响面和基线,再用 USE 方法检查资源,用进程工具定位到具体执行流,最后进入运行时 profile。工具只是证据采集方式,结论必须有前后对比和回滚验证。
思考题
- USE 方法的三个检查项是什么?
vmstat中 b 列高说明什么?strace为什么不能随意长期使用?- 火焰图的宽度代表什么?
- 设计一次线上延迟升高的排查报告。