先看系统(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/调度)里的哪一个。
mpstat -P ALL 1 # 哪些核忙?%usr/%sys/%soft/%irq
vmstat 1 # r 是否很大(可运行队列)
top -H # 看线程(哪几个线程吃 CPU)
pidstat -u -t 1 # 按线程看 CPU(更稳)
sudo perf top -p <pid>
sudo perf record -F 99 -g -p <pid> -- sleep 30
sudo perf report --stdio
常见原因:线程在 D 状态等 IO、等锁、等网络、或调度等待(Off-CPU)。
vmstat 1 # 看 b(不可中断睡眠)、wa(iowait)
pidstat -w -t 1 # 看上下文切换(自愿/非自愿)
pidstat -d 1 # 看进程 IO(是否是 IO 把它拖住)
perf sched(复杂)offcputime-bpfcc(更直接)iostat -xz 1 # util/await/aqu-sz/r/s,w/s
sudo iotop -oPa
pidstat -d 1
blktrace/blkparsebiolatency-bpfcc(看延迟分布)、bioslower-bpfcc(抓慢请求)free -h
vmstat 1 # si/so 是否在抖(swap in/out)
ps -eo pid,comm,rss,%mem --sort=-rss | head
top # 看 RES(常用)
pmap/smem 等)valgrind / sanitizer 做根因确认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。
原则:短时间、强过滤、只为验证假设。
sudo strace -tt -T -f -p <pid> -e trace=%file,%network
sudo strace -c -p <pid> # 只看统计(更轻)
(可替代)perf trace -p <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 确认