Linux 服务器性能问题排查常用工具汇总

Linux 服务器性能问题排查常用工具汇总

以下工具清单不仅列出命令,还会深入说明每个工具背后依赖的内核机制数据来源采样原理开销影响适用场景边界以及常见误区,帮助你从“会用”升级到“懂为什么这么用”。

1. 基础工具(内核数据直接暴露层)

工具内核机制 / 数据来源采样/刷新原理开销级别典型误区与注意事项深度使用技巧示例
top / htop/proc/[pid]/stat、/proc/stat、/proc/meminfo1秒(默认)轮询读取 procfs★☆☆☆☆误把 page cache 当成“内存泄漏”;htop 默认不显示线程htop → F2 → Display options → Detailed CPU time(显示 us/sy/hi/si/wa/st)
vmstat/proc/stat、/proc/vmstat、/proc/diskstats内核计数器差值计算(可指定间隔)★☆☆☆☆只看 wa 列就下结论;忽略 si/so 与 cs 的关联vmstat 1 5 | awk ‘NR>2 {print $15 ” ” $10 ” ” $12}’(只看 wa/cs/io)
iostat/proc/diskstats + block layer 统计块设备层计数器差值(支持多设备)★☆☆☆☆%util 接近 100% 不一定慢(nvme 多队列下可能误导)iostat -x -o JSON 1 5 | jq .(结构化输出,便于脚本/监控)
mpstat/proc/stat 的 per-cpu 分拆与 vmstat 同源,但按 CPU 核拆分★☆☆☆☆忽略 %irq / %soft 列;云主机常漏看 %stealmpstat -P ALL -I SUM 1 5(同时看中断统计)
pidstat/proc/[pid]/stat + /proc/[pid]/io 等进程级计数器差值,支持线程(-t)★★☆☆☆默认不显示线程;-d/-w 间隔太短会放大噪声pidstat -u -t 1 5 -G java(只看 java 相关线程)
ssnetlink socket + kernel sock_diag实时读取内核 socket 表(比 netstat 快 10x+)★☆☆☆☆ss -s 的 retrans 是累计值,要看增长率watch -n 1 ‘ss -s

2. 中阶工具(采样 + 统计层)

工具内核机制 / 数据来源采样原理开销级别典型误区与注意事项深度使用技巧示例
iotop/proc/[pid]/io + task_io_accounting周期性读取每个进程的 read_bytes/write_bytes★★☆☆☆需要 root;容器内可能看不到宿主机 IOiotop -o -b -n 5 -d 1 > iotop.log(批量记录,便于事后分析)
sarkernel 通过 sadc 周期写入 /var/log/sa*历史二进制日志(默认 10 分钟一次)★☆☆☆☆默认不采集所有设备;历史文件可能被 logrotate 删sar -A -f /var/log/sa/$(date +%d)(查看某一天全指标)
straceptrace 系统调用跟踪每次系统调用都停下来读取寄存器与参数★★★★☆开销极大(可达 10–100x 慢);多线程程序跟踪混乱strace -c -f -p PID -e trace=read,write,fsync(只跟踪 IO 相关调用)
lsof/proc/[pid]/fd + /proc/[pid]/cwd 等读取进程 fd 表 + inode 反查文件名★★☆☆☆输出非常多时卡顿;deleted 文件显示 (deleted)lsof -p PID +D /var/log(看某个目录下被哪些进程打开)

3. 深度诊断工具(eBPF / perf / 采样层)

工具内核机制 / 数据来源采样/跟踪原理开销级别典型误区与注意事项深度使用技巧示例
perfPerformance Counters(PMU)+ kprobe/uprobe周期性采样(默认 99Hz/4kHz)或事件驱动★★☆☆☆默认用户态采样漏掉内核栈;需要符号表或 debuginfoperf record -F 199 -g -p PID — sleep 30 perf script | FlameGraph 生成火焰图
async-profilerJVMTI + perf_events + AsyncGetCallTrace安全点采样 + safepoint 外采样(-e itimer)★☆☆☆☆只对 Java 进程有效;需 root 或 capability./profiler.sh -e cpu -d 30 -f flame.html PID ./profiler.sh -e lock …(锁分析)
bpftraceeBPF(BPF_PROG_TYPE_KPROBE/TRACEPOINT 等)内核态/用户态事件实时注入字节码执行★★☆☆☆语法门槛高;老内核可能不支持某些 tracepointbpftrace -e ‘kprobe:vfs_read { @[comm] = count(); }’(统计谁在读文件)
BCC (biolatency 等)eBPF 预置工具集封装常用场景的 bpftrace 脚本★★☆☆☆需要编译安装;容器内可能需要挂载 /sys/kernel/debugbiolatency -D(磁盘 IO 延迟分布图,按设备分开展示)
sysdigeBPF + kernel module(旧版)或纯 eBPF系统调用 + 容器元数据实时捕获★★★☆☆高吞吐场景开销可观;容器需 –privileged 或特定 mountsysdig -p “%proc.name %evt.type %evt.args” container.name=nginx

4. 工具组合推荐流程(生产中最常用路径)

60 秒粗筛 uptime → htop(按 1 + 按 P + 按 t)→ free -wh → vmstat 1 5 → iostat -xmdz 1 5 → ss -s

进程级定位 pidstat -u/-d/-w 1 10(CPU/IO/上下文) iotop -o(实时 IO) ps -eo pid,ppid,%cpu,%mem,rss,nlwp,lstart,cmd –sort=-%cpu | head -15(线程数 NLWP)

热点函数 / 代码定位 perf record -F 99 -g -p PID — sleep 30 → perf script | FlameGraph (Java)async-profiler -e cpu -d 30 -f flame.html PID

系统调用 / 锁等待 strace -c -f -p PID -e trace=futex,epoll_wait bpftrace -e ‘tracepoint:syscalls:sys_enter_futex { @[comm] = count(); }’

历史回溯 sar -A -f /var/log/sa/$(date +%d -d “yesterday”)(昨天全指标)

一句话工具链心法

粗筛靠 top/vmstat/iostat → 进程靠 pidstat/iotop → 热点靠 perf/async-profiler → 阻塞/锁靠 strace/bpftrace → 历史靠 sar

这些工具的组合几乎覆盖了 95% 的线上性能问题定位场景。

Telegram
Telegram@IDCSELL