关于 flamegraphs
这项技能指导 Agent 将分析器数据转换为 SVG 火焰图,并解读图表以支持 CPU 优化。内容涵盖多种分析器格式及前后对比。
主要功能
- 01从 perf 数据生成火焰图
- 02转换 Callgrind、Go pprof 和 DTrace 数据
- 03对比改动前后的分析结果
- 04解读堆栈宽度、深度与热点
- 05自定义 SVG 输出选项
适用场景
- 01定位程序中的 CPU 热点
- 02比较改动前后的性能
- 03可视化 Callgrind 或 Go pprof 数据
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ mohitmishra786/ low-level-dev-skills --skill flamegraphs安装后在 Claude Code 中输入/flamegraphs确认已加载。
附带文件references/tools.md
详细介绍
火焰图
用途
指导 Agent 完成从性能分析器数据到 SVG 火焰图的流程,并讲解如何解读火焰图,以便据此做出具体的优化决策。
触发语
- “如何根据 perf 数据生成火焰图?”
- “如何解读火焰图?”
- “火焰图显示有一个很宽的框,这意味着什么?”
- “如何根据 Callgrind 生成火焰图?”
- “我想比较两张火焰图(优化前/后)”
工作流
1. 安装 FlameGraph 工具
git clone https://github.com/brendangregg/FlameGraph
# No install needed; scripts are in the repo
export PATH=$PATH:/path/to/FlameGraph
2. perf → 火焰图(最常用路径)
# Step 1: record
perf record -F 999 -g -o perf.data ./prog
# Step 2: generate script output
perf script -i perf.data > out.perf
# Step 3: collapse stacks
stackcollapse-perf.pl out.perf > out.folded
# Step 4: generate SVG
flamegraph.pl out.folded > flamegraph.svg
# Step 5: view
xdg-open flamegraph.svg # Linux
open flamegraph.svg # macOS
单行命令:
perf record -F 999 -g ./prog && perf script | stackcollapse-perf.pl | flamegraph.pl > fg.svg
3. 差分火焰图(优化前/后)
# Collect two profiles
perf record -g -o before.data ./prog_old
perf record -g -o after.data ./prog_new
# Collapse
perf script -i before.data | stackcollapse-perf.pl > before.folded
perf script -i after.data | stackcollapse-perf.pl > after.folded
# Diff (red = regressed, blue = improved)
difffolded.pl before.folded after.folded | flamegraph.pl > diff.svg
4. Callgrind → 火焰图
valgrind --tool=callgrind --callgrind-out-file=cg.out ./prog
stackcollapse-callgrind.pl cg.out | flamegraph.pl > fg.svg
5. 其他性能分析器输入
# Go pprof
go tool pprof -raw -output=prof.txt prog
stackcollapse-go.pl prof.txt | flamegraph.pl > fg.svg
# DTrace
dtrace -x ustackframes=100 -n 'profile-99 /execname=="prog"/ { @[ustack()] = count(); }' \
-o out.stacks sleep 10
stackcollapse.pl out.stacks | flamegraph.pl > fg.svg
# Java (async-profiler)
async-profiler -d 30 -f out.collapsed PID
flamegraph.pl out.collapsed > fg.svg
6. 解读火焰图
火焰图是调用栈的可视化图表:
- X 轴:CPU 时间(不是时间序列)——越宽表示耗时越长
- Y 轴:调用栈深度——越高表示调用链越深
- 颜色:随机(没有特别含义)——差分模式除外
需要关注的内容:
| 模式 | 含义 | 操作 |
|---|---|---|
| 底部附近的宽框 | 函数本身是热点 | 优化该函数 |
| 宽框上方有高而窄的塔形框 | 调用了许多不同的被调用函数 | 热点分派;减少调用开销 |
| 非常高且底部宽阔的调用栈 | 深度递归 | 检查递归深度;考虑改用迭代方式 |
| 顶部的平台 | 没有被调用函数的叶子函数 | 该叶子函数才是真正的热点 |
| 许多相同的窄调用栈 | 许多线程在执行相同的工作 | 考虑并行处理或批处理 |
找出可采取优化措施的热点:
- 找出最宽的顶部框(上方没有子框或只有较窄的子框)
- CPU 时间实际消耗在这里
- 向下追溯,了解是什么调用了它以及原因
差分火焰图:
- 红色框:新配置文件中的耗时更多(性能回退)
- 蓝色框:新配置文件中的耗时更少(性能提升)
- 只出现在一个配置文件中的框会以纯色显示
7. flamegraph.pl 选项
flamegraph.pl --title "My App" \
--subtitle "Release build, workload X" \
--width 1600 \
--height 16 \
--minwidth 0.5 \
--colors java \
out.folded > fg.svg
| 选项 | 效果 |
|---|---|
--title | SVG 标题 |
--width | 宽度(像素) |
--height | 框高(像素) |
--minwidth | 忽略小于 N% 的框(减少杂乱) |
--colors | 调色板:hot(默认)、mem、io、java、js、perl、red、green、blue |
--inverted | 冰柱图(根节点在顶部) |
--reverse | 反转调用栈 |
--cp | 使用一致的调色板(相同的框在不同 SVG 中使用相同的颜色) |
参考资料
有关工具安装、stackcollapse 脚本和调色板选项,请参阅 references/tools.md。
相关技能
- 使用
skills/profilers/linux-perf收集 perf 数据 - 使用
skills/profilers/valgrind收集 Callgrind 数据 - 使用
skills/compilers/clang根据采样配置文件生成 LLVM PGO
评论
支持 Markdown