perf 是什么、何时用
更新时间:2026-10-01。这是 README 之外的总览篇,回答“遇到性能问题,为什么第一反应是 perf”。
一、统一入口
perf 是构建在内核 perf_events 接口上的工具集,一个工具覆盖:硬件性能计数器(PMU)、软件事件(调度/缺页)、tracepoint、动态探针(kprobe/uprobe)。既能计数(perf stat,总量统计)又能采样(perf record/report,定位热点)。
二、为什么选 perf
| 对比 | perf | 其它 |
|---|---|---|
| 开销 | 低,可上生产 | valgrind 慢数十倍 |
| 系统级 | 内核+用户态全栈 | gprof 仅用户态、需插桩 |
| 重编译 | 不需要 | gprof 需 -pg |
三、决策树

四、常见坑
- 一上来就 flamegraph,缺少总量指标方向。
- 用 valgrind 在生产大数据量上跑。
- 忽视权限(kernel.perf_event_paranoid)导致采不到。
小结
perf 是低开销、系统级、免重编译的统一剖析入口;先用 stat 定方向,再用 record/c2c 等深挖。下一篇 perf 安装与版本。
总结
perf 是构建在内核 perf_events 上的统一工具集,一个入口覆盖 PMU 硬件计数器、软件事件、tracepoint、kprobe/uprobe,既能计数(stat 看总量)又能采样(record/report 定位热点);相比 valgrind 慢数十倍、gprof 需重编译且仅用户态,它低开销、系统级全栈、免重编译、可上生产;正确起手式永远是先 perf stat 看 CPI/缓存/分支定方向——CPI 高 miss 低走 record+火焰图查计算热点、cache miss 高走 c2c/mem、CPU 不满走 offcpu/sched/锁——切勿一上来就 flamegraph,并注意 perf_event_paranoid 权限。