Perf 是 Linux 下对接内核事件的低开销深度性能分析工具,支持进程级 CPU、内存、锁、调度等采样,无需插桩或改代码,可定位至函数、指令及 cache miss 级瓶颈。

Perf 是 Linux 下最强大的性能分析工具之一,能直接对接内核事件,实现对进程级 CPU、内存、锁、调度等维度的低开销深度采样。它不依赖用户态插桩,无需修改代码,即可定位到函数、指令甚至 cache miss 级别的瓶颈点。
精准采集目标进程的运行时行为
使用 perf record 指定 PID 或命令启动进程,是获取真实负载的关键:
- 对已运行进程采样:
perf record -p <pid> -g -- sleep 30(-g 启用调用图,-- 表示参数结束) - 启动新进程并采集:
perf record -g ./myapp arg1 arg2 - 限制采样频率避免干扰:
-F 99(每秒 99 次,平衡精度与开销) - 指定事件类型可聚焦问题,例如:
-e cycles,instructions,cache-misses
用 perf report 逐层下钻热点函数与调用链
perf report 默认展示符号化后的火焰图式调用栈,支持交互式导航:
- 按
→进入子调用,←返回上层,快速定位耗时占比高的函数 -
--no-children关闭子树聚合,查看原始采样分布 -
-F symbol,dso显示函数名 + 所属模块(如 libc.so.6、mylib.so),便于识别第三方库开销 - 若符号缺失,需确保二进制含 debuginfo(
debuginfod或本地安装debuginfo包)
结合 perf script 提取原始事件轨迹做定制分析
当默认视图不够用时,perf script 输出结构化文本流,可用于脚本后处理:
- 导出带时间戳和调用栈的样本:
perf script -F time,comm,pid,tid,cpu,event,sym,dso,ip,period - 过滤特定函数的 cache miss:
perf script | awk '$9 ~ /my_hot_function/ && $5 ~ /cache-misses/' - 统计每个 CPU 上的调度延迟:
perf script -F comm,pid,cpu,time -e sched:sched_stat_sleep | awk '{sum[$3]+=$5} END{for (c in sum) print c, sum[c]}'
定位典型瓶颈的常用组合技巧
不同问题类型对应不同事件与视角:
-
CPU 密集型:用
cycles+-g查热点函数;叠加instructions算 IPC(instructions/cycles),IPC -
内存瓶颈:采集
mem-loads,mem-stores,cache-misses,dtlb-load-misses,配合perf mem record获取访存地址和访问模式 -
锁竞争:启用
lock:lock_acquire,lock:lock_release事件,再用perf report --sort=comm,symbol,ip找频繁加锁函数 -
上下文切换高:采集
context-switches,结合perf script -F comm,pid,tid,cpu,time分析切换频次与来源
Perf 的能力远超简单计数,核心在于理解事件语义、合理组合采样策略,并借助符号与上下文还原真实执行路径。一次高质量的 perf 采集,往往比加日志或改代码更快定位根因。











