火焰图生成流程
火焰图把采样结果按调用栈聚合成一张可交互的图:横向方块的宽度代表该调用路径的样本占比,纵向表示调用关系,自下而上是调用方向。它适合做整体归因:不用逐个函数读报告,一眼就能看出哪些路径占据了大头,也便于把结论直接分享给团队。
基本信息
| 适用平台 | Linux(生成链路基于通用脚本) |
|---|---|
| 输入 | 采样数据导出的事件流 |
| 中间格式 | 折叠栈:一行一条调用链加样本计数 |
| 输出 | 可交互的矢量图,支持搜索调用路径 |
| 关键前提 | 采集时带调用栈且栈完整 |
典型使用场景
- 整体归因:快速看出主要开销集中在哪几条路径。
- 给团队或评审提供直观的性能画像。
- 对比两个版本的图形差异,验证优化方向。
- 在图中搜索某个函数名,确认它出现在哪些调用路径上。
- 定位第三方库在整条链路中的占比。
生成流程
生成流程
perf record -F 99 -g -p 12345 -- sleep 30 # 采集带调用栈的样本
perf script > /tmp/out.perf # 导出事件流
./stackcollapse-perf.pl /tmp/out.perf > /tmp/out.folded # 折叠成一行一条调用链
./flamegraph.pl /tmp/out.folded > /tmp/flame.svg # 渲染矢量图
ls -lh /tmp/flame.svg # 确认输出文件生成
grep -c 'handle_request' /tmp/out.folded # 也可以先在折叠文件里检索读图要点
| 图形特征 | 含义 | 注意点 |
|---|---|---|
| 方块宽度 | 该调用路径的样本占比 | 宽度只反映采样口径 |
| 纵向层级 | 调用关系,下为调用方 | 断层说明调用栈不完整 |
| 顶部平缓的宽块 | 直接消耗处理器的地方 | 优先看这些位置 |
| 颜色 | 渲染时的随机配色 | 不含任何语义 |
火焰图回答「时间花在哪里」,不回答「为什么慢」:看到宽块之后仍要结合代码与业务逻辑判断,比如是算法问题还是数据规模变化。
调用栈不完整时图形会出现断层,此时宽度会被错误地归到上层函数,得优化结论也会偏;先检查采集方式与符号解析,再解读图形。