Linux系统性能排查工具表

先看系统(CPU / IO / 内存 / 网络 / 锁等待),再对准 PID 做证据采集(perf/strace/tcpdump/valgrind


整体资源

# CPU/IO/NET/MEM/上下文切换
dstat -cdnmyl --top-cpu --top-io --top-mem 1

# 进程层:谁在吃 CPU / MEM
top  htop

# 进程层:谁在做 IO(只看有 IO 的)
sudo iotop -oPa

排查到当前主要瓶颈是 CPU / IO / 内存 / 网络 / 等待(锁/IO/调度)里的哪一个


1. CPU 高(%us/%sy 高,机器“忙”)

系统层确认

mpstat -P ALL 1          # 哪些核忙?%usr/%sys/%soft/%irq
vmstat 1                 # r 是否很大(可运行队列)

进程层定位

top -H                   # 看线程(哪几个线程吃 CPU)
pidstat -u -t 1          # 按线程看 CPU(更稳)

深挖(锁定 PID 后)

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

2. load 高但 CPU 不高(“慢/卡”,但 %idle 还在)

常见原因:线程在 D 状态等 IO、等锁、等网络、或调度等待(Off-CPU)。

先分清在等什么

vmstat 1                 # 看 b(不可中断睡眠)、wa(iowait)
pidstat -w -t 1          # 看上下文切换(自愿/非自愿)
pidstat -d 1             # 看进程 IO(是否是 IO 把它拖住)

深挖(可选:需要 Off-CPU 证据时)


3. 磁盘/块设备 IO 异常(iowait、await 高、队列大、吞吐打满)

系统层确认

iostat -xz 1             # util/await/aqu-sz/r/s,w/s

找“谁在做 IO”

sudo iotop -oPa
pidstat -d 1

需要追“慢请求”时(按你熟悉的工具选)


4. 内存压力 / swap 抖动 / OOM

系统层确认

free -h
vmstat 1                 # si/so 是否在抖(swap in/out)

进程层定位(谁在涨 RSS)

ps -eo pid,comm,rss,%mem --sort=-rss | head
top                      # 看 RES(常用)

深挖(“线上收线索,线下做确认”)


5. 网络异常(连接暴增、延迟高、重传/丢包、带宽打满)

先确认“连接与队列”

ss -s
ss -tanp | head

深挖(要证据就抓包)

sudo tcpdump -i any -nn -s 96 -w /tmp/capture.pcap 'host <ip> and port <port>'

eBPF:tcpretrans-bpfcc/tcpconnect-bpfcc/tcplife-bpfcc


6. 文件系统/系统调用异常(怀疑 open/read/write/网络 syscall 卡住或风暴)

原则:短时间、强过滤、只为验证假设

sudo strace -tt -T -f -p <pid> -e trace=%file,%network
sudo strace -c -p <pid>          # 只看统计(更轻)

(可替代)perf trace -p <pid> 在很多场景更轻。


7. 已经锁定 PID 了:通用“进程深挖三件套”

# CPU 热点证据
sudo perf top -p <pid>

# 或者 
sudo profile-bpfcc -p <pid> -f 99 > oncpu.txt

# 系统调用层面的“它到底在干嘛”
sudo strace -tt -T -f -p <pid> -e trace=%file,%network

# 内存类问题:线上收线索,线下用 valgrind/sanitizer 确认
emacs 用户的 tmux 生存指南
bthread 栈溢出(guard page)