服务公告

服务公告 > 技术教程 > 火焰图怎么读:性能瓶颈可视化入门

火焰图怎么读:性能瓶颈可视化入门

发布时间:2026-07-12 09:51
## 概念是什么 火焰图把采样得到的调用栈画成一叠矩形:每一层代表一帧调用,宽度正比于该函数在采样中出现的次数,也就是消耗 CPU 的比例。它把几万行栈数据压缩成一张可以肉眼扫描的图,哪里宽哪里就是热点,一眼定位性能瓶颈的所在层。 ## 背后原理 读图三原则:横向看比例,纵向看调用路径。同一层内左右顺序无关紧要,只比宽度;越宽的块表示该函数自身及栈顶属于它的采样越多;纵向堆叠表达谁调用谁,栈顶朝上。整图宽度是全部采样,一块占三分之一宽度就等于吃掉了三分之一的 CPU。颜色仅作视觉区分,暖色不代表更热,热度只由宽度表达。 ``` perf record -F 99 -a -g -- sleep 30 perf script | stackcollapse-perf.pl | flamegraph.pl > perf.svg ``` ## 最小实操 生成流程固定三步:用 perf record 采样,采样频率九十九赫兹、带调用栈、限时三十秒;perf script 导出原始栈;用火焰图工具集的两个脚本依次折叠与绘图,输出一个矢量图文件,浏览器打开即可交互查看,点击任一块还能放大其子树。 采样的时段要有代表性,业务高峰采一次、平峰采一次,对比两图的差异往往比单图更有信息量。 ## 常见错误 只看栈顶会误判,宽块可能是被上层循环调出来的,治理要顺着调用路径找性价比最高的层。on-CPU 图看不到睡眠与 IO 等待,等待型瓶颈要换 off-CPU 采样方法。顺云云服务器上采样需要 root 权限与内核参数配合,虚拟化环境偶尔限制采样,遇到采集为空先检查权限与限制,不要急着下结论。 图形变体按需取用:常规 CPU 图之外,还有按线程分色的版本用于看线程竞争,内存分配图用于看分配热点,差分火焰图把前后两次采样画在一起,优化效果一目了然。生成脚本本身无依赖、可移植,放进排障工具箱,一台跳板机就能服务全组。看到热点后先判断层次:自己代码的宽块直接优化,库函数的宽块查调用来源,改变调用方式常常比换库更实际。