mcpField
F
flamegraphs

flamegraphs

github.com/mohitmishra786开发269692 次安装18 周前更新
代码仓库

关于 flamegraphs

这项技能指导 Agent 将分析器数据转换为 SVG 火焰图,并解读图表以支持 CPU 优化。内容涵盖多种分析器格式及前后对比。

主要功能

  1. 01从 perf 数据生成火焰图
  2. 02转换 Callgrind、Go pprof 和 DTrace 数据
  3. 03对比改动前后的分析结果
  4. 04解读堆栈宽度、深度与热点
  5. 05自定义 SVG 输出选项

适用场景

  1. 01定位程序中的 CPU 热点
  2. 02比较改动前后的性能
  3. 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 轴:调用栈深度——越高表示调用链越深
  • 颜色:随机(没有特别含义)——差分模式除外

需要关注的内容:

模式含义操作
底部附近的宽框函数本身是热点优化该函数
宽框上方有高而窄的塔形框调用了许多不同的被调用函数热点分派;减少调用开销
非常高且底部宽阔的调用栈深度递归检查递归深度;考虑改用迭代方式
顶部的平台没有被调用函数的叶子函数该叶子函数才是真正的热点
许多相同的窄调用栈许多线程在执行相同的工作考虑并行处理或批处理

找出可采取优化措施的热点:

  1. 找出最宽的顶部框(上方没有子框或只有较窄的子框)
  2. CPU 时间实际消耗在这里
  3. 向下追溯,了解是什么调用了它以及原因

差分火焰图:

  • 红色框:新配置文件中的耗时更多(性能回退)
  • 蓝色框:新配置文件中的耗时更少(性能提升)
  • 只出现在一个配置文件中的框会以纯色显示
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
选项效果
--titleSVG 标题
--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