直接回答:火焰图每格是一个栈帧,宽度是该栈在采样中出现的比例(即 CPU 时间占比),纵向是调用深度——宽平顶的帧是自身耗时热点(plateau),读法是从底向上看调用链、从上向下找最宽的自耗帧。颜色通常无语义(Go pprof 的火焰图用颜色区分包),别被“红色告警”的直觉误导。

展开解析:典型形态:宽平顶出现在序列化/压缩/crypto 函数——真计算热点,优化方向是算法或换库;整根柱子又高又窄的锯齿塔——深层递归或过深抽象(层层 interface 包装),考虑展开或批处理;runtime.mallocgc 占宽条——分配压力大,转向内存 profile 找分配点做复用;runtime.schedule、chanops、sync 原语宽大——并发结构问题(锁竞争、通道阻塞),CPU profile 只见冰山一角,要配合 block/mutex profile;syscall 占比高且集中 read/write——IO 模式问题(小批量高频写),上 bufio 或批量。解读纪律:先按宽度排序找前三个平顶,占总时间常超 50%,盯住它们收益最大;宽度小于 1% 的帧忽略;对比优化前后的火焰图要看占比变化而非绝对宽度(总时长变了)。工具细节:pprof web 界面火焰图可点帧聚焦调用子树;采样偏差存在——短任务采集窗口拉长到 30s 以上。最后提醒:火焰图回答“CPU 花在哪”,回答不了“为什么慢”——尾部延迟、锁等待、GC 停顿要换对应 profile。

追问方向:差分火焰图怎么做?off-CPU 火焰图与 on-CPU 如何配合?

(约 460 字)