Linux 服务器性能问题排查常用工具汇总
以下工具清单不仅列出命令,还会深入说明每个工具背后依赖的内核机制、数据来源、采样原理、开销影响、适用场景边界以及常见误区,帮助你从“会用”升级到“懂为什么这么用”。
1. 基础工具(内核数据直接暴露层)
| 工具 | 内核机制 / 数据来源 | 采样/刷新原理 | 开销级别 | 典型误区与注意事项 | 深度使用技巧示例 |
|---|---|---|---|---|---|
| top / htop | /proc/[pid]/stat、/proc/stat、/proc/meminfo | 1秒(默认)轮询读取 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 列;云主机常漏看 %steal | mpstat -P ALL -I SUM 1 5(同时看中断统计) |
| pidstat | /proc/[pid]/stat + /proc/[pid]/io 等 | 进程级计数器差值,支持线程(-t) | ★★☆☆☆ | 默认不显示线程;-d/-w 间隔太短会放大噪声 | pidstat -u -t 1 5 -G java(只看 java 相关线程) |
| ss | netlink 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;容器内可能看不到宿主机 IO | iotop -o -b -n 5 -d 1 > iotop.log(批量记录,便于事后分析) |
| sar | kernel 通过 sadc 周期写入 /var/log/sa* | 历史二进制日志(默认 10 分钟一次) | ★☆☆☆☆ | 默认不采集所有设备;历史文件可能被 logrotate 删 | sar -A -f /var/log/sa/$(date +%d)(查看某一天全指标) |
| strace | ptrace 系统调用跟踪 | 每次系统调用都停下来读取寄存器与参数 | ★★★★☆ | 开销极大(可达 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 / 采样层)
| 工具 | 内核机制 / 数据来源 | 采样/跟踪原理 | 开销级别 | 典型误区与注意事项 | 深度使用技巧示例 |
|---|---|---|---|---|---|
| perf | Performance Counters(PMU)+ kprobe/uprobe | 周期性采样(默认 99Hz/4kHz)或事件驱动 | ★★☆☆☆ | 默认用户态采样漏掉内核栈;需要符号表或 debuginfo | perf record -F 199 -g -p PID — sleep 30 perf script | FlameGraph 生成火焰图 |
| async-profiler | JVMTI + perf_events + AsyncGetCallTrace | 安全点采样 + safepoint 外采样(-e itimer) | ★☆☆☆☆ | 只对 Java 进程有效;需 root 或 capability | ./profiler.sh -e cpu -d 30 -f flame.html PID ./profiler.sh -e lock …(锁分析) |
| bpftrace | eBPF(BPF_PROG_TYPE_KPROBE/TRACEPOINT 等) | 内核态/用户态事件实时注入字节码执行 | ★★☆☆☆ | 语法门槛高;老内核可能不支持某些 tracepoint | bpftrace -e ‘kprobe:vfs_read { @[comm] = count(); }’(统计谁在读文件) |
| BCC (biolatency 等) | eBPF 预置工具集 | 封装常用场景的 bpftrace 脚本 | ★★☆☆☆ | 需要编译安装;容器内可能需要挂载 /sys/kernel/debug | biolatency -D(磁盘 IO 延迟分布图,按设备分开展示) |
| sysdig | eBPF + kernel module(旧版)或纯 eBPF | 系统调用 + 容器元数据实时捕获 | ★★★☆☆ | 高吞吐场景开销可观;容器需 –privileged 或特定 mount | sysdig -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% 的线上性能问题定位场景。