性能诊断是 SRE 的核心技能。Linux 提供了丰富的性能分析工具,从简单的 top 到强大的 perf/eBPF,每个工具都有其适用场景。掌握这些工具的使用时机和方法,是快速定位性能瓶颈的关键。本文按 CPU、内存、IO、网络和综合工具五大维度,逐步梳理 Linux 性能诊断工具集,并提供使用场景速查表和实战案例。
负载监控工具#
top:经典进程监控#
$ top
# 顶部摘要信息
top - 15:30:00 up 30 days, 3:21, 3 users, load average: 1.23, 0.98, 0.85
Tasks: 234 total, 1 running, 233 sleeping, 0 stopped, 0 zombie
%Cpu(s): 12.3 us, 3.4 sy, 0.0 ni, 83.3 id, 0.5 wa, 0.0 hi, 0.5 si, 0.0 st
MiB Mem : 32000.0 total, 5000.0 free, 15000.0 used, 12000.0 buff/cache
MiB Swap: 4096.0 total, 3900.0 free, 196.0 used. 20000.0 avail Mem
# 进程列表
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
12345 root 20 0 12.5g 6.2g 12345 S 150 19.2 120:34 java
12346 www-data 20 0 500.0m 100.0m 20000 S 15 0.3 5:23 nginx
top 交互命令#
| 按键 | 功能 |
|---|
P | 按 CPU 占用排序 |
M | 按内存占用排序 |
N | 按 PID 排序 |
T | 按运行时间排序 |
1 | 展开各 CPU 核心详情 |
H | 显示线程而非进程 |
c | 显示完整命令行 |
f | 选择显示字段 |
W | 保存配置 |
k | 杀死进程 |
r | 修改 nice 值 |
z | 彩色显示 |
top 关键字段解读#
load average: 1.23, 0.98, 0.85
# 1分钟/5分钟/15分钟平均负载
# 负载 ≠ CPU 使用率,包含等待 CPU、IO、锁的进程
%Cpu(s): 12.3 us, 3.4 sy, 0.0 ni, 83.3 id, 0.5 wa, 0.0 hi, 0.5 si, 0.0 st
# us: 用户态 CPU
# sy: 内核态 CPU
# ni: nice > 0 的进程 CPU
# id: 空闲
# wa: IO 等待
# hi: 硬中断
# si: 软中断
# st: 被虚拟化层偷走的时间
htop:交互式进程监控#
$ apt install htop # Debian/Ubuntu
$ dnf install htop # RHEL/CentOS
$ htop
# 比 top 更友好的界面:
# - 彩色 CPU 核心可视化
# - 进程树视图
# - 鼠标支持
# - 快捷键操作
htop 常用操作#
| 按键 | 功能 |
|---|
F5 | 树形视图 |
F6 | 排序 |
F7/F8 | 降低/提高 nice 值 |
F9 | 发送信号 |
F10 | 退出 |
t | 树形显示 |
H | 显示/隐藏线程 |
Tab | 切换进程所有者 |
htop 配置#
# ~/.config/htop/htoprc
# 或通过 F2 设置:
# - 显示字段
# - 颜色方案
# - 更新频率
# - CPU 平均值显示方式
atop:全系统性能监控#
$ apt install atop
$ dnf install atop
$ atop 1 # 每秒刷新
atop 的优势在于能看到进程级别的资源消耗,包括磁盘 I/O 和网络:
ATOP - server 2026/07/10 15:30:00 -------------------
1m 5m 15m
cpu sys 30% user 50% sys 25% user 45% sys 20% user 40%
cpu irq 2% idle 18% irq 1% idle 29% irq 1% idle 39%
cpu wait 0% wait 0% wait 0%
DISK busy read write | busy read write | busy read write
sda 45% 12K 345K | 30% 10K 300K | 25% 8K 250K
NET transport receive send | transport receive send
eth0 1234/s 100KB 50KB | 1000/s 80KB 40KB
PID USER CPU% MEM% DSK% NET% COMMAND
12345 root 150 19 5 1 java
12346 www 15 0 2 0 nginx
常用 top 技巧#
# 批处理模式(适合脚本)
$ top -b -n 1 -c | head -20
# 监控特定进程
$ top -p 12345,12346
# 指定刷新次数
$ top -n 5
# 输出到文件
$ top -b -n 10 -d 5 > top-output.txt
# 只看 CPU 占用前 10
$ top -b -n 1 -o %CPU | head -17
CPU 分析工具#
vmstat:系统级 CPU/内存概览#
$ vmstat 1 5
procs -----------memory---------- ---cpu----
r b swpd free buff cache si so us sy id wa st
2 0 100000 5G 2G 10G 0 0 30 10 55 5 0
1 0 100000 5G 2G 10G 0 0 35 12 50 3 0
| 字段 | 说明 | 关注点 |
|---|
r | 运行队列长度 | > CPU 核数说明 CPU 瓶颈 |
b | 阻塞进程数 | > 0 说明有 IO 等待 |
us | 用户态 CPU | 高说明应用 CPU 密集 |
sy | 内核态 CPU | > 20% 说明系统调用频繁 |
id | 空闲 CPU | 低说明 CPU 瓶颈 |
wa | IO 等待 | > 5% 说明 IO 瓶颈 |
si/so | swap 换入/换出 | > 0 说明内存不足 |
mpstat:多核 CPU 统计#
$ apt install sysstat
$ mpstat -P ALL 1 5
# -P ALL 显示所有 CPU 核心
10:00:01 AM CPU %usr %nice %sys %iowait %irq %soft %steal %idle %gnice
10:00:02 AM all 30.5 0.0 8.2 0.5 0.0 0.3 0.0 60.5 0.0
10:00:02 AM 0 55.0 0.0 10.0 0.0 0.0 0.0 0.0 35.0 0.0
10:00:02 AM 1 5.0 0.0 3.0 0.0 0.0 0.0 0.0 92.0 0.0
# CPU 0 负载高,CPU 1 空闲 → 负载不均
pidstat:进程级 CPU 统计#
# 查看所有进程 CPU 使用
$ pidstat 1 5
# 查看特定进程
$ pidstat -p 12345 1 5
# 查看线程级 CPU
$ pidstat -p 12345 -t 1 5
# 查看进程上下文切换
$ pidstat -w 1 5
# 查看进程的 CPU 使用分布
$ pidstat -p 12345 -u -t 1
perf:Linux 性能分析利器#
# 安装
$ apt install linux-tools-common linux-tools-$(uname -r)
$ dnf install perf
# 查看 CPU 占用最高的函数
$ perf top
# 记录 10 秒的 CPU 事件
$ perf record -a -g -- sleep 10
# 查看报告
$ perf report
# 统计 CPU 周期
$ perf stat -a -- sleep 10
# 追踪特定进程
$ perf record -p 12345 -g -- sleep 10
$ perf report
perf 常用事件#
# 查看可用事件
$ perf list
# 常用硬件事件
$ perf stat -e cycles,instructions,cache-misses,branch-misses -- sleep 10
# 常用软件事件
$ perf stat -e context-switches,cpu-migrations,page-faults -- sleep 10
# 追踪系统调用
$ perf trace -p 12345
# 追踪特定系统调用
$ perf trace -e read,write -p 12345
perf record 详细用法#
# 记录调用栈
$ perf record -g -p 12345 -- sleep 30
# 记录指定事件
$ perf record -e cpu-clock -g -p 12345 -- sleep 30
# 记录所有 CPU
$ perf record -a -g -- sleep 10
# 指定采样频率
$ perf record -F 99 -g -p 12345 -- sleep 30
# -F 99: 每秒采样 99 次
# 记录到指定文件
$ perf record -o perf.data -g -p 12345 -- sleep 30
# 分析
$ perf report --sort overhead,symbol
Flame Graph:火焰图#
# 安装 flamegraph 工具
$ git clone https://github.com/brendangregg/FlameGraph.git
$ cd FlameGraph
# 1. 使用 perf 采集数据
$ perf record -F 99 -a -g -- sleep 30
$ perf script > out.perf
# 2. 生成火焰图
$ ./stackcollapse-perf.pl out.perf > out.folded
$ ./flamegraph.pl out.folded > flamegraph.svg
# 3. 在浏览器中打开 flamegraph.svg
火焰图解读#
┌───[func_c]──────┐
│ │
[func_b] [func_d]
│
[func_a]
│
[main]
- 宽度 = 函数占用 CPU 的比例
- 高度 = 调用栈深度
- 颜色 = 随机(无特定含义,On-CPU 图通常暖色)
- 平顶 = CPU 热点函数
不同类型的火焰图#
| 类型 | 采集方式 | 用途 |
|---|
| On-CPU | perf record | CPU 热点分析 |
| Off-CPU | eBPF/offcputime | IO/锁等待分析 |
| Memory | perf record -e minor-faults | 内存分配分析 |
| System Call | perf trace | 系统调用分析 |
eBPF/bcc 工具#
# 查看进程 on-CPU 时间
$ /usr/share/bcc/tools/profile.py -p 12345 -F 99 --duration 10
# 查看进程 off-CPU 时间
$ /usr/share/bcc/tools/offcputime -p 12345 10
# 查看系统调用
$ /usr/share/bcc/tools/trace.py 'SyS_*'
# 查看 CPU 热点
$ /usr/share/bcc/tools/profile.py -af
# 查看上下文切换
$ /usr/share/bcc/tools/stackcount.py t:sched:sched_switch
内存分析工具#
free:内存概览#
$ free -h
total used free shared buff/cache available
Mem: 32Gi 15Gi 5Gi 200Mi 12Gi 16Gi
Swap: 4Gi 196Mi 3.9Gi
# 关键字段:
# total: 总内存
# used: 已使用(不含 buff/cache)
# free: 完全空闲
# buff/cache: 内核缓存(可回收)
# available: 应用可用内存(free + 可回收的 buff/cache)
重要:判断内存是否不足,看 available 而非 free。free 少但 available 充足是正常的。
/proc/meminfo:详细内存信息#
$ cat /proc/meminfo
MemTotal: 33554432 kB
MemFree: 5242880 kB
MemAvailable: 16777216 kB # 应用可用
Buffers: 2097152 kB # 块设备缓冲
Cached: 10485760 kB # Page Cache
SwapCached: 200704 kB # Swap 中的缓存
Active: 12582912 kB # 活跃内存
Inactive: 4194304 kB # 非活跃内存
SwapTotal: 4194304 kB
SwapFree: 3997696 kB
Dirty: 1024 kB # 脏页
AnonPages: 8388608 kB # 匿名页(应用内存)
Slab: 2097152 kB # Slab 缓存
SReclaimable: 1572864 kB # 可回收 Slab
SUnreclaim: 524288 kB # 不可回收 Slab
vmstat:内存与交换#
$ vmstat 1 5
procs -----------memory---------- ---cpu----
r b swpd free buff cache si so us sy id wa st
1 0 200000 5G 2G 10G 0 0 30 10 55 5 0
2 1 200000 4.5G 2G 10G 5 0 40 15 40 5 0
# si > 0: 正在从 swap 换入 → 内存不足
# so > 0: 正在向 swap 换出 → 内存不足
# b > 0: 有进程在等待 IO → 可能是 swap IO
pmap:进程内存映射#
# 查看进程内存映射
$ pmap -x 12345 | tail -5
# 输出:地址 大小 RSS 脏页 权限 描述
# 查看内存映射概要
$ pmap -x 12345 | tail -1
total 12345678 6789012 123456
# 排序查看最大映射
$ pmap -x 12345 | sort -k3 -n -r | head -10
# 查看共享库
$ pmap 12345 | grep ".so" | sort -k2 -n -r
smaps:详细内存映射#
# 查看进程的详细内存映射
$ cat /proc/12345/smaps_rollup
Rss: 6553600 kB # RSS
Pss: 6291456 kB # 比例分摊
Private_Clean: 10240 kB
Private_Dirty: 5242880 kB # 私有脏页(关注此项是否持续增长)
Shared_Clean: 51200 kB
Shared_Dirty: 20480 kB
Anonymous: 5242880 kB # 匿名内存
# 查看特定映射区域
$ cat /proc/12345/smaps | grep -A 15 "heap"
sar:历史内存数据#
# 查看内存使用趋势
$ sar -r 1 5
# KBMEMFREE KBMEMUSED %MEMUSED KBBUFFERS KBCACHED KBSSWAPUSED
# 5242880 28311552 84.38 2097152 10485760 200704
# 查看交换活动
$ sar -W 1 5
# pswpin/s pswpout/s
# 0 0 # 无 swap 活动
# 查看分页活动
$ sar -B 1 5
# pgpgin/s pgpgout/s fault/s majflt/s pgfree/s
# 0 0 1234.56 0.00 5678.90
# 查看历史数据
$ sar -r -f /var/log/sa/sa10 # 10 号的数据
$ sar -r -s 09:00:00 -e 12:00:00 # 指定时间段
IO 分析工具#
iostat:磁盘 IO 统计#
$ iostat -xdm 1 5
# -x: 扩展统计
# -d: 仅设备
# -m: 以 MB 为单位
Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await %util
sda 0.5 2.0 50.0 100.0 2.5 5.0 50.0 1.5 10.0 75.0
nvme0n1 0.0 0.5 200.0 50.0 1.0 0.25 5.0 0.1 0.5 12.0
| 字段 | 说明 | 关注点 |
|---|
r/s w/s | 每秒读/写 IOPS | 评估负载 |
rMB/s wMB/s | 每秒读/写吞吐 | 评估带宽 |
avgrq-sz | 平均请求大小(扇区) | 小=随机 IO,大=顺序 IO |
avgqu-sz | 平均队列长度 | > 1 说明有积压 |
await | 平均 I/O 延迟(ms) | SSD < 5ms,HDD < 20ms |
%util | 设备利用率 | > 80% 说明接近瓶颈 |
注意:%util 在多队列设备(NVMe)上可能误导。当 I/O 速率很高但 await 很低时,即使 %util=100% 也不一定有瓶颈。
iotop:进程级 IO 监控#
$ apt install iotop
$ iotop -o # 只显示有 IO 的进程
$ iotop -oP # 只显示进程(非线程)
Total DISK READ: 50.0 M/s | Total DISK WRITE: 20.0 M/s
PID PRIO USER DISK READ DISK WRITE SWAPIN IO> COMMAND
12345 be4 root 45.0 M/s 5.0 M/s 0.00 % 90.0 % dd if=/dev/zero of=/tmp/test
12346 be4 www 2.0 M/s 10.0 M/s 0.00 % 15.0 % nginx: worker
pidstat:进程级 IO 统计#
# 查看 IO 统计
$ pidstat -d 1 5
# PID kB_rd/s kB_wr/s kB_ccwr/s iodelay Command
# 12345 46080.00 5120.00 0.00 0 dd
# 组合 CPU + IO + 内存
$ pidstat -urd 1 5
biolatency/biotop(eBPF)#
# 查看块 IO 延迟分布
$ /usr/share/bcc/tools/biolatency 10
# 查看进程 IO 吞吐排行
$ /usr/share/bcc/tools/biotop 10 1
# 查看哪些进程在等待 IO
$ /usr/share/bcc/tools/biosnoop 10
# 查看文件 IO 延迟
$ /usr/share/bcc/tools/filetop 10 1
网络分析工具#
# iftop:网络流量监控
$ iftop -i eth0 -n
# nethogs:进程级网络流量
$ nethogs eth0
# ss:连接状态统计
$ ss -s # 概要
$ ss -tn state established | wc -l # 活跃连接数
$ ss -tn state time-wait | wc -l # TIME_WAIT 数
# sar:网络统计
$ sar -n DEV 1 5 # 网卡流量
$ sar -n TCP 1 5 # TCP 统计
$ sar -n SOCK 1 5 # Socket 统计
# tcpdump:抓包
$ tcpdump -i eth0 -nn port 443 -c 1000 -w capture.pcap
$ tcpdump -i eth0 -nn 'tcp[tcpflags] & tcp-syn != 0' # 只看 SYN
# iperf3:网络吞吐测试
$ iperf3 -c target -P 10 -t 60 # 10 并发连接测 60 秒
综合工具#
sar:系统活动报告#
sar 是最全面的系统性能历史数据工具,适合趋势分析和事后排查。
# 安装
$ apt install sysstat
$ dnf install sysstat
# 启用数据采集
# /etc/default/sysstat
ENABLED="true"
$ systemctl enable --now sysstat
sar 常用选项#
# CPU 使用率
$ sar -u 1 5 # 实时
$ sar -u -f /var/log/sa/sa10 # 10 号的数据
# 各 CPU 核心使用率
$ sar -P ALL 1 5
# 内存使用
$ sar -r 1 5
# 交换活动
$ sar -W 1 5
# 磁盘 IO
$ sar -d 1 5 # 设备级
$ sar -p -d 1 5 # 显示设备名
# 网络流量
$ sar -n DEV 1 5
$ sar -n EDEV 1 5 # 网卡错误
# TCP 统计
$ sar -n TCP 1 5
$ sar -n ETCP 1 5 # TCP 错误
# 上下文切换
$ sar -w 1 5
# 中断
$ sar -I SUM 1 5
# 文件操作
$ sar -v 1 5
# 历史数据查询
$ sar -u -f /var/log/sa/sa10 -s 09:00:00 -e 12:00:00
sar 数据文件管理#
# 数据文件位置
$ ls /var/log/sa/
sa01 sa02 ... sa10 sa11 ... sa31
# sa10: 10 号的二进制数据
# sar10: 10 号的文本数据(如果配置了 sa2 脚本)
# 配置数据保留
# /etc/sysconfig/sysstat 或 /etc/default/sysstat
HISTORY=7 # 保留 7 天
COMPRESSAFTER=15 # 15 天后压缩
dstat:多维度实时监控#
$ apt install dstat
$ dstat -tcdnym --top-cpu --top-mem --top-io
# 同时显示: 时间 CPU 磁盘 网络 内存 + CPU/内存/IO 最高的进程
# 常用组合
$ dstat -cdnm # CPU 磁盘 网络 内存
$ dstat --disk-util # 磁盘利用率
$ dstat --tcp # TCP 状态
$ dstat --fs # 文件系统
$ dstat --unix # Unix Socket
$ dstat --output stats.csv # 输出到 CSV
sysstat 工具集#
# pidstat: 进程统计
$ pidstat -u 1 # CPU
$ pidstat -r 1 # 内存
$ pidstat -d 1 # IO
$ pidstat -w 1 # 上下文切换
# cifsiostat: CIFS 统计
$ cifsiostat 1
# nfsiostat: NFS 统计
$ nfsiostat 1
使用场景速查表#
CPU 相关问题#
| 现象 | 首选工具 | 次选工具 | 关键指标 |
|---|
| CPU 使用率高 | top/htop | perf top | %CPU > 80% |
| CPU 负载高但使用率低 | vmstat | pidstat -w | r > 核数, wa 高 |
| CPU 使用不均 | mpstat -P ALL | top + 按 1 | 各核差异大 |
| 找 CPU 热点函数 | perf record | flamegraph | overhead% |
| 进程 CPU 异常高 | pidstat -u | perf record -p | %CPU 趋势 |
| 上下文切换过多 | pidstat -w | vmstat | cswch/s > 50000 |
| 调度延迟 | perf sched | runqlat (bcc) | 延迟 > 10ms |
内存相关问题#
| 现象 | 首选工具 | 次选工具 | 关键指标 |
|---|
| 内存不足 | free -h | vmstat | available 低 |
| OOM Killer | journalctl -k | dmesg | “Out of memory” |
| 内存泄漏 | pmap -x | smaps_rollup | RSS 持续增长 |
| swap 频繁 | vmstat | sar -W | si/so > 0 |
| 进程内存明细 | pmap -x | /proc/PID/smaps | Private_Dirty |
| Page Cache 占用高 | free -h | /proc/meminfo | Cached + SReclaimable |
| 内存分配追踪 | perf record -e kmem | memleak (bcc) | 分配调用栈 |
磁盘 IO 问题#
| 现象 | 首选工具 | 次选工具 | 关键指标 |
|---|
| IO 延迟高 | iostat -x | biolatency (bcc) | await > 20ms |
| IO 吞吐低 | iostat -x | biotop (bcc) | rMB/s + wMB/s |
| 找 IO 大户 | iotop | pidstat -d | kB_rd/s + kB_wr/s |
| IO wait 高 | top/vmstat | iostat | wa > 5% |
| 文件级 IO | filetop (bcc) | opensnoop (bcc) | 读/写次数 |
| IO 队列积压 | iostat -x | vmstat | avgqu-sz > 1 |
网络问题#
| 现象 | 首选工具 | 次选工具 | 关键指标 |
|---|
| 网络延迟高 | ping | tcpdump | RTT |
| 吞吐低 | iperf3 | sar -n DEV | 带宽 |
| 连接数高 | ss -s | sar -n SOCK | established 数 |
| TIME_WAIT 多 | ss | netstat | time-wait 数 |
| 丢包 | ifconfig | sar -n EDEV | drops/errors |
| 找流量大户 | nethogs | iftop | 进程级流量 |
| TCP 重传 | ss -ti | nstat | retransRate |
| 抓包分析 | tcpdump | wireshark | 包内容 |
实战案例#
案例 1:CPU 使用率飙升排查#
# 1. 发现 CPU 100%
$ top
# PID 12345 (java) CPU 200%
# 2. 查看是用户态还是内核态
$ pidstat -p 12345 -u 1 5
# %usr 150% %sys 50% → 用户态为主
# 3. 查看线程级 CPU
$ top -H -p 12345
# PID 12350 (java) CPU 100%
# 4. 采集火焰图
$ perf record -F 99 -p 12350 -g -- sleep 30
$ perf script > out.perf
$ ./flamegraph.pl out.folded > flamegraph.svg
# 5. 分析火焰图发现热点函数
# 例如: HashMap.resize() 占用 80%
# 根因: HashMap 并发扩容导致死循环
案例 2:数据库 IO 延迟排查#
# 1. 检查 IO 延迟
$ iostat -xdm 1 5
# sda: await=35ms, %util=95% # HDD await > 20ms 异常
# 2. 找 IO 大户
$ iotop -oP
# PID 54321 (mysqld) READ 45MB/s
# 3. 检查 MySQL
$ mysql -e "SHOW PROCESSLIST"
# 发现大量全表扫描查询
# 4. 使用 biolatency 确认延迟分布
$ /usr/share/bcc/tools/biolatency 10
# 延迟分布: 50% 在 16-32ms, 10% 在 64-128ms
# 5. 解决: 添加索引, 优化查询
案例 3:内存泄漏排查#
# 1. 监控 RSS 变化
$ while true; do
cat /proc/12345/status | grep VmRSS
sleep 60
done
# VmRSS 持续增长, 每小时增加 100MB
# 2. 分析内存分布
$ cat /proc/12345/smaps_rollup
# Private_Dirty 持续增长 → 匿名内存泄漏
# 3. 使用 eBPF 追踪内存分配
$ /usr/share/bcc/tools/memleak -p 12345
# 显示泄漏调用栈
# 4. 对于 Java 应用
$ jmap -dump:format=b,file=/tmp/heap.hprof 12345
# 使用 MAT 分析堆转储
案例 4:网络延迟排查#
# 1. 检查网络延迟
$ ping target
# RTT = 50ms(正常 < 1ms)
# 2. 检查 TCP 重传
$ nstat -az | grep -i retrans
# TcpRetransSegs 值很高
# 3. 抓包分析
$ tcpdump -i eth0 -nn host target -w capture.pcap -c 10000
$ tcpdump -r capture.pcap -nn | grep -c "retransmission"
# 4. 检查网卡错误
$ sar -n EDEV 1 5
# rxerr/s 或 txerr/s > 0
# 5. 检查连接队列
$ ss -lnt
# Recv-Q > 0 说明全连接队列积压
案例 5:综合性能分析#
# 使用 dstat 同时监控多维度
$ dstat -tcdnym --top-cpu --top-mem --top-io --output perf.csv 1 300
# 分析 CSV 数据
$ python3 -c "
import csv
with open('perf.csv') as f:
reader = csv.reader(f)
for row in reader:
if 'cpu' in str(row).lower():
print(row)
"
# 使用 sar 采集历史数据用于事后分析
$ sar -u -f /var/log/sa/sa10 -s 14:00:00 -e 15:00:00
# 分析故障时段的 CPU 变化
工具选择决策树#
性能问题排查
├── CPU 问题
│ ├── 整体 CPU 高 → top → vmstat
│ ├── 找热点进程 → top/htop → pidstat
│ ├── 找热点函数 → perf record → flamegraph
│ └── CPU 不均 → mpstat -P ALL → taskset
│
├── 内存问题
│ ├── 内存不足 → free → vmstat → /proc/meminfo
│ ├── OOM → journalctl -k → /var/log/messages
│ ├── 内存泄漏 → pmap → smaps → memleak (bcc)
│ └── swap 频繁 → vmstat → sar -W
│
├── IO 问题
│ ├── IO 延迟高 → iostat -x → biolatency (bcc)
│ ├── 找 IO 大户 → iotop → pidstat -d
│ ├── IO wait 高 → top → vmstat
│ └── 文件级 IO → filetop (bcc) → opensnoop (bcc)
│
├── 网络问题
│ ├── 延迟高 → ping → tcpdump
│ ├── 吞吐低 → iperf3 → sar -n DEV
│ ├── 连接数高 → ss → sar -n SOCK
│ └── 丢包 → ifconfig → sar -n EDEV
│
└── 综合分析
├── 实时监控 → dstat → atop
├── 历史趋势 → sar
└── 深度分析 → perf → eBPF/bcc
Linux 性能诊断工具体系庞大,但每个工具都有其适用场景。核心要点:
- top/htop 是入口工具:快速了解系统整体状况,定位异常进程。
- vmstat 是万能工具:一行命令同时看到 CPU、内存、IO 的概况。
- iostat 是 IO 诊断的核心:
-x 选项提供 await、%util 等关键指标。 - perf + flamegraph 是深度分析利器:从函数级别定位 CPU 热点。
- eBPF/bcc 是新一代工具:可以追踪内核和用户态的任何事件,延迟分析更精确。
- sar 是历史数据分析的唯一选择:生产环境必须开启 sysstat 数据采集。
- pidstat 是进程级分析的好帮手:CPU、内存、IO、上下文切换一网打尽。
- 工具选择遵循"从宽到窄"原则:先用 top/sar 看全局,再用 pidstat/iostat 定位进程/设备,最后用 perf/eBPF 分析根因。
性能诊断的黄金法则:先描述问题,再选择工具。明确现象(CPU 高?IO 慢?网络抖?)→ 确定方向(进程级?系统级?)→ 选择工具 → 采集数据 → 分析根因,而非上来就乱敲命令。