Linux 性能分析工具详解

Linux 性能分析工具详解

在 Linux 服务器运维与性能优化工作中,“不知道瓶颈在哪里”永远是最让人焦虑的状态。 CPU 使用率高?内存泄漏?磁盘 IO 饱和?网络丢包?锁竞争?软中断过载?还是应用本身算法复杂度爆炸? 每一种可能性都需要不同的工具去验证,而盲目猜测、随意调参只会浪费时间,甚至把系统越调越差。

本文将围绕生产环境中真正高频使用、诊断能力最强的性能分析工具,按照从基础到高级、从宏观到微观的顺序,系统讲解它们的适用场景、核心指标解读、典型用法以及实际案例中的定位思路。目标是让你在遇到“服务器卡了/慢了/负载高了”时,能迅速形成清晰的诊断路径,而不是漫无目的敲命令。

全文约 2100 字,建议收藏备用,下次出问题时直接对照流程走。

一、宏观概览工具(1 分钟快速定性)

这些工具用来回答最核心的问题:“现在系统到底卡在哪里?”

1. top / htop / glances(日常第一屏)

  • top:最基础,wa%(iowait)高 → 先怀疑 IO;us+sy 高 → CPU 计算密集;hi+si 高 → 中断或软中断
  • htop:树形进程视图 + 颜色 + 鼠标操作,F2 设置显示列(加 DELAY、SWAP、IO% 等),F6 按 CPU/内存/IO 排序
  • glances:一屏看全(CPU、内存、IO、网络、进程、磁盘、传感器),支持 Web 模式和导出 InfluxDB/Prometheus

使用建议

  • wa% > 20–30% 持续 → 优先看 IO(iostat / iotop)
  • us+sy > 80% 且 id 几乎为 0 → CPU 密集,先 perf top
  • hi+si 很高 → 中断问题,先看 mpstat / /proc/interrupts

2. vmstat / mpstat / pidstat(宏观指标组合拳)

  • vmstat 1 5:经典五元组(procs r/b、memory free/buff/cache、swap si/so、cpu us/sy/id/wa/st、system in/cs)
    • r 值持续 > 核数 → CPU 饱和或大量进程在 run queue 等待
    • b 值持续 > 0 → 进程在等待 IO
    • si/so 不为 0 且持续 → 内存真不足,正在疯狂换页
  • mpstat -P ALL 1 5:每核使用率 + iowait + 软中断
    • 某核 100%,其他核很低 → 单线程瓶颈 / 中断不均衡 / 锁竞争
    • 软中断(%soft)持续 > 20–30% → 网络小包洪水
  • pidstat -u 1 / pidstat -d 1:进程级 CPU / IO 统计
    • 快速定位哪个进程在吃 CPU / 哪个进程在狂 IO

二、CPU 性能分析工具链(从宏观到微观)

1. perf(火焰图之王,生产必备)

perf 是 Linux 内核自带的性能分析神器,几乎能覆盖所有 CPU 相关瓶颈。

最常用用法(按优先级排序)

  1. perf top(实时热点函数)
    • 看哪个函数/系统调用/内核路径最吃 CPU
    • 常见发现:__schedule、futex_wait、copy_user_generic_string、tcp_sendmsg 等
  2. perf record + perf report(采样调用栈)
    • perf record -g — sleep 10(全局采样 10 秒)
    • perf record -p <PID> -g — sleep 5(针对进程)
    • perf report → 生成火焰图(需 FlameGraph 工具链)
  3. perf stat(精确计数)
    • perf stat -d sleep 10(统计 cycles、instructions、cache-miss、branch-miss 等)
    • IPC(instructions per cycle)< 1 → 存在大量 stall(内存延迟、分支预测失败等)
  4. 常见火焰图解读
    • 大量时间在 futex_wait / mutex_lock → 锁竞争
    • 大量时间在 copy_*_user → 用户态与内核态频繁拷贝(网络/IO)
    • 大量时间在 schedule / __switch_to → 上下文切换爆炸
    • 大量时间在 tcp_* / skb_* → 网络协议栈开销

2. bpftrace / bcc(eBPF 动态追踪)

当 perf 采样精度不够、或需要跟踪特定事件时,eBPF 工具链几乎无敌。

高频用法示例

  • runqlat:看进程在 run queue 等待的时间分布(判断 CPU 饱和度)
  • biolatency:磁盘 IO 延迟分布(区分随机/顺序、读/写)
  • tcptop:实时看哪个进程在收发多少 TCP 流量
  • profile:类似 perf top,但支持更多自定义过滤
  • offcputime:看进程在哪些地方阻塞(等锁、等 IO、等网络)

优势

  • 零开销或极低开销
  • 可动态挂钩任意内核函数、tracepoint、kprobe/uprobe
  • 支持条件过滤、聚合统计、火焰图输出

3. strace / ltrace / gdb(系统调用与库函数级)

当怀疑应用卡在某个系统调用或库函数时使用。

  • strace -c -p <PID>:统计每个系统调用的次数与耗时
  • strace -T -tt -f -p <PID>:带时间戳、子进程、详细耗时
  • ltrace -p <PID>:跟踪动态库函数调用(libc、libssl 等)

典型发现

  • 大量 epoll_wait / select / poll → IO 多路复用模型问题
  • 大量 futex_wait → 用户态锁竞争
  • 大量 read/write → 小包频繁 IO(Nagle 算法或缓冲区太小)

三、内存与 IO 相关分析工具(常与 CPU 耦合)

1. free / vmstat / sar(内存压力判断)

  • free -wh:关注 available 而非 free
  • vmstat 1 5:si/so 持续不为 0 → 真内存不足
  • sar -r 1 5:%memused、%commit、pgfault 等

2. slabtop(内核对象缓存压力)

  • dentry / inode 占用过高 → 文件系统元数据压力(小文件多)
  • kmalloc-* 占用过高 → 内核频繁小块内存分配

3. iostat / iotop / biolatency(IO 与 CPU 耦合)

  • iostat -x:%util、await、svctm、r/s w/s
  • iotop -o:哪个进程在制造 IO
  • biolatency(bcc/eBPF):IO 延迟分布(区分随机/顺序)

四、总结:Linux 性能分析的完整工具链与诊断路径

  1. 先用 glances / htop / top 快速定性(CPU/内存/IO/网络/进程状态)
  2. 用 vmstat / mpstat / pidstat 确认是否 CPU bound、IO bound 或内存压力
  3. 如果 CPU 高 → perf top / perf record → 火焰图 → 定位热点函数 / 系统调用
  4. 如果锁竞争 / 阻塞 → bpftrace offcputime / strace -c
  5. 如果网络相关 → ss -s / tcptop / runqlat(结合 CPU)
  6. 如果 IO 相关 → iostat -x + iotop + biolatency
  7. 如果内存相关 → free -wh + slabtop + vmstat si/so

 好的性能分析不是记住所有工具,而是记住“先宏观定性,再微观定位,最后验证假设”的诊断闭环

当你能熟练在 5–15 分钟内通过 glances → vmstat → perf top → 火焰图 → bpftrace 这一条线走完,大部分线上性能问题都能快速找到根因,而不是盲目调参数、加机器。

Telegram
Telegram@IDCSELL