首页/系统/Linux 内核与性能调优速查/perf + FlameGraph 火焰图流程

perf + FlameGraph 火焰图流程

把 perf 采样导出后经 collapse 生成火焰图: 宽度代表采样占比, 层级代表调用栈, 用于整体归因。

火焰图生成流程

火焰图把采样结果按调用栈聚合成一张可交互的图:横向方块的宽度代表该调用路径的样本占比,纵向表示调用关系,自下而上是调用方向。它适合做整体归因:不用逐个函数读报告,一眼就能看出哪些路径占据了大头,也便于把结论直接分享给团队。

基本信息

适用平台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      # 也可以先在折叠文件里检索

读图要点

图形特征含义注意点
方块宽度该调用路径的样本占比宽度只反映采样口径
纵向层级调用关系,下为调用方断层说明调用栈不完整
顶部平缓的宽块直接消耗处理器的地方优先看这些位置
颜色渲染时的随机配色不含任何语义
火焰图回答「时间花在哪里」,不回答「为什么慢」:看到宽块之后仍要结合代码与业务逻辑判断,比如是算法问题还是数据规模变化。
调用栈不完整时图形会出现断层,此时宽度会被错误地归到上层函数,得优化结论也会偏;先检查采集方式与符号解析,再解读图形。

易错点

  • 调用栈采集不完整造成断层,宽度归属错误,据此优化错方向。
  • 把方块宽度直接等同于耗时占比而不看采样口径,忽略了采样频率与窗口的影响。
  • 忽略颜色没有语义这件事,误以为不同颜色代表不同类型。
  • 采集窗口与现象时段错位,图很漂亮但与问题无关。
  • 只看图不回到代码:图形只能指出位置,优化方案仍要读代码得出。

数据来源与参考

  • FlameGraph 项目说明(brendangregg/FlameGraph)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌