火焰图能直接定位CPU热点,关键看顶部最宽色块;横轴为采样占比,纵轴为调用栈深度,颜色仅作区分,“平顶”区域指示高负载调用链。

火焰图能直接告诉你哪段代码在“烧CPU”,不用猜、不靠日志,关键看顶部最宽的色块——那里就是CPU时间消耗最多的位置。
看懂火焰图的三个核心规则
火焰图横轴不是时间,而是采样次数占比;越宽的函数,被采到的次数越多,实际占用CPU时间就越长。纵轴是调用栈深度:顶部是当前正在执行的函数,往下一层层是它的调用者。颜色本身无语义,只用于区分函数,通常用暖色系增强视觉聚焦。
真正要盯的是“平顶”——顶部连续几层宽度接近、没有明显收窄的区域。这说明这一串调用链整体处于高负载状态,而不是某个孤立函数拖慢了整个链路。
快速定位CPU热点的实操路径
先确认是否为On-CPU问题:用top -H -p <PID>找出高CPU线程TID,再用perf record -F 99 -g -p <PID> --sleep 30采集30秒调用栈。生成火焰图后,重点观察:
- 顶部最宽的函数名(例如processEvents或decodeFrame)
- 该函数下方是否持续展开多层用户态调用(说明是业务逻辑热点)
- 是否大量堆叠在malloc、memcpy、pthread_mutex_lock等基础函数上(提示内存/锁瓶颈)
- 底部是否频繁出现sys_read、ext4_writepage等内核函数(可能暴露I/O等待或文件系统压力)
Flink等框架中的火焰图特殊用法
Flink 1.13+内置火焰图支持,开启rest.flamegraph.enabled: true后,在Web UI作业图中点开算子→Flame Graph标签页,可切换On-CPU / Off-CPU / Mixed视图:
- On-CPU:只展示RUNNABLE和NEW状态线程,适合查计算密集型瓶颈(如序列化、窗口聚合)
- Off-CPU:聚焦WAITING、BLOCKED线程,能一眼看出反压卡点、锁竞争或下游消费慢
- Mixed:两者合并,适合初筛,但需注意On/Off样本混在一起可能干扰判断
避免误读火焰图的常见陷阱
编译时没加-g会导致perf只显示地址(如0x000055a...),无法映射到函数名;采样频率设太高(如-F 999)会放大测量扰动,生产环境建议用99Hz避开内核100Hz定时器干扰;火焰图默认按字母序排列x轴,所以不能直接读“从左到右的时间流”。
真正有效的分析,是把火焰图和perf stat输出对照着看:如果IPC(每周期指令数)低于1.0,且火焰图顶部堆满分支预测失败或缓存未命中相关函数,那问题很可能在CPU流水线或内存访问模式,而非单纯算法逻辑。



















