Linux perf 工具分析系统性能问题

1次阅读

Linux perf 工具分析系统性能问题

perflinux 内核自带的性能分析利器,无需额外安装(只要内核启用了 CONFIG_PERF_EVENTS),能直接采集 CPU、内存、调度、中断、锁、cache 等多维度底层事件,定位真实瓶颈非常高效。

快速上手常用命令

日常排查建议从这几个命令开始,覆盖大多数场景:

  • perf top:实时查看占用 CPU 最高的函数(类似 top,但基于采样,开销低)
  • perf record -g -p <pid></pid>:对指定进程录制调用(-g 启用调用图),适合分析慢服务或卡顿程序
  • perf record -e cycles,instructions,cache-misses -a sleep 5:全局采集 5 秒的 CPU 周期、指令数、缓存未命中等关键指标
  • perf report --no-children:查看 record 结果,加 --no-children 避免调用栈折叠干扰主因识别

识别 CPU 瓶颈的核心技巧

单纯看“CPU 使用率高”没意义,要区分是真计算、频繁上下文切换,还是自旋等待。perf 能帮你拆解:

  • perf record -e cpu-cycles,task-clock,instructions,context-switches -a sleep 10 对比 cpu-cycles / instructions —— 比值明显升高说明 IPC 下降,可能遇到分支预测失败、cache miss 或流水线停顿
  • context-switches 异常高,配合 perf record -e sched:sched_switch 查看切换原因,再用 perf script 追踪谁在频繁唤醒/休眠
  • 发现大量 __fgetdo_syscall_64 占比高?可能是系统调用过载,检查是否在高频读写小文件、频繁创建 socket 等

定位内存与缓存问题

内存类性能问题常表现为延迟高、吞吐低,perf 可结合硬件事件精准定位:

  • perf record -e mem-loads,mem-stores,mem-loads:u,mem-stores:u -a sleep 5:区分用户态内存访问频次,再用 perf report -F overhead,symbol,dso 看哪段代码触发最多访存
  • perf record -e cache-references,cache-misses -a sleep 5:计算 cache miss ratio(miss / references),超过 1–2% 就值得警惕;若 miss 主要发生在 L1d,则大概率是数据局部性差或数组步长不友好
  • 怀疑 TLB 压力大?用 perf record -e dTLB-loads,dTLB-load-misses,miss ratio > 5% 时需检查是否分配了大量小内存块或 VMA 过碎

分析锁竞争与调度延迟

线程程序卡顿,未必是 CPU 满,更可能是线程在等锁或被调度器延迟:

  • perf record -e sched:sched_stat_sleep,sched:sched_stat_wait,sched:sched_migrate_task -a sleep 5:捕获线程睡眠、就绪队列等待、迁移事件,perf script 输出中关注 wait 时间长的线程及其调用栈
  • 分析自旋锁?启用内核配置 CONFIG_LOCKDEPCONFIG_LOCK_STAT 后,用 perf record -e lock:lock_acquired,lock:lock_contended 查看哪些锁争抢激烈
  • 想确认是否受 CPU 频率限制?perf record -e power:cpu_frequency 可记录频率变化,配合负载看是否因 thermal throttling 被降频

perf 不依赖符号表也能工作,但加上 debuginfo(如 debuginfo-install kernel-core 或安装对应 -debuginfo 包)后,函数名、行号、内联信息才完整。线上环境可先用 perf buildid-list 记录 build-id,离线用本地 debuginfo 解析,兼顾安全与可读性。

text=ZqhQzanResources