perf 火焰图怎么生成?三步出图,宽的就是热点
答案:perf record -g 采样 → stackcollapse-perf.pl 折叠调用栈 → flamegraph.pl 渲染 SVG,浏览器打开即得火焰图。横轴宽度 = CPU 时间占比,越宽越热。
最快路径(三步)
# 1. 采样 20 秒(按 CPU 频率 99Hz,避免整数周期与程序共振)
sudo perf record -g -F 99 -p <PID> -- sleep 20
# 2. 折叠调用栈(需 FlameGraph 工具集)
sudo perf script > out.perf
./stackcollapse-perf.pl out.perf > out.folded
# 3. 渲染火焰图
./flamegraph.pl out.folded > flamegraph.svg
# 浏览器打开 flamegraph.svg也可以跳过手动步骤,直接用现成脚本 perf script | stackcollapse-perf.pl | flamegraph.pl > fg.svg 一步到位。
看图要点
- 宽 = 热:横轴是 CPU 时间占比,一个函数块越宽占 CPU 越多;
- 看平顶大块:顶部平而宽的函数是主要热点,优先优化它;
- 烟囱 = 短调用:尖而窄的塔是频繁短调用(syscall、锁竞争),配合
perf top/perf annotate定位; - 颜色无含义:火焰图颜色只是随机区分调用链,不代表冷热。
常见坑
- 无符号全是地址:程序需
-g编译且未 strip;内核需 root +kptr_restrict=0; - 漏进程:
-p只跟指定 PID,追踪所有进程用-a; - 采样太短:热点不稳定时至少采 30 秒。
深度入口
- 原理与更多用法:perf 火焰图完全指南
- perf 命令全解:perf 使用指南
- 可运行实验:demos/cpu-demo
FAQ
Q: perf 火焰图怎么生成? A: 三步:1) perf record -g -p <PID> 采样;2) 用 stackcollapse-perf.pl 折叠调用栈;3) flamegraph.pl 渲染成 SVG 火焰图,浏览器打开即可。
Q: perf record 采样时要注意什么? A: 用 -g 开启调用栈采样;加 -F 指定采样频率(如 99Hz);-p 指定进程;采样 10~30 秒即可,期间保持进程在热点状态。
Q: 火焰图怎么读?宽的是什么意思? A: 横轴宽度代表 CPU 时间占比,越宽越热。顶部一条是当前正在执行的函数,下面叠的是调用链。看"平顶大块"就是主要热点。
Q: 火焰图有尖尖的"烟囱"说明什么? A: 尖顶通常代表频繁的短调用(如系统调用、锁竞争、频繁函数调用),需要配合 perf top 或 perf annotate 定位具体指令。
Q: 为什么我 perf 出的火焰图没有符号,全是地址? A: 目标程序要带调试符号(-g 编译)且不能 strip;也可以安装 debuginfo 包。内核热点需用 root 或配置 kptr_restrict=0。
Q: 火焰图会不会漏掉短生命周期进程? A: 会。perf record -p 只跟踪指定 PID;想跟踪所有进程用 -a(全系统采样),新进程也会被记录。
一句话总结:perf record -g + stackcollapse-perf.pl + flamegraph.pl 三步出图,横轴宽度即 CPU 占比,找最宽最平的那块下手优化。