为什么会用到火焰图?火焰图能干那些事儿?
- 分析函数执行的频度;
- 分析哪些函数经常阻塞;
- 分析哪些函数频繁操作内存;
火焰图的主要特点:
- 每一列代表一个调用栈,每个格子代表一个函数;
- 纵轴呈现出栈的深度,按照各函数的调用关系自下而上排列;
- 最顶端的格子代表采样时正在占用CPU的函数;
- 横轴:采集到的调用栈的信息,按字母顺序从左到右依次排列;
- 每个格子的颜色是随机的,颜色深浅没具体意义;
- 火焰图主要有5种:On-CPU、Off-CPU、内存、红蓝、Hot/Cold火焰图(火焰图官方文档);
- On-CPU火焰图的横轴指CPU占用时间,Off-CPU火焰图的横轴代表阻塞时间;
- 采样的方式可以是单线程、多线程、多进程等。
注意:横轴不代表时间,宽度表示在采样过程中出现的频率:一个格子的宽度越大,表示这个函数被采集到的次数越多。亦即是该函数造成性能瓶颈的可能性越大。
火焰图类型简介
类型 | 横轴意义 | 适用场景 | 采样方式 |
---|---|---|---|
CPU火焰图(也叫On-CPU火焰图) | CPU占用时间 | 1. 找到CPU占用高的函数; 2. 分析代码热路径 | 固定频率采样CPU调用栈 |
Off-CPU火焰图 | 阻塞时间 | 1. 分析I/O、网络阻塞场景导致的性能问题; 2. 分析锁竞争、死锁导致的性能问题 | 固定频率采样阻塞事件调用栈 |
内存火焰图 | 内存申请、释放函数调用次数 | 1. 分析内存泄漏问题; 2. 找到内存占用高的对象、申请内存多的函数; 3. 分析虚拟内存或物理内存泄漏问题; | 四种采样方式: 1. 跟踪malloc/free; 2. 跟踪brk; 3. 跟踪mmap; 4. 跟踪页错误; |
Hot/Cold火焰图 | On-CPU和Off-CPU综合展示 | 需要结合CPU占用和阻塞进行综合分析的场景; | On-CPU和Off-CPU的结合; |
红蓝交叉火焰图 | 红色表示上升、蓝色表示下降 | 不同版本之间性能对比 | 对比两个On-CPU火焰图; |
使用哪种火焰图?On-CPU or Off CPU ?
取决于当前的性能瓶颈是什么:如果CPU是瓶颈则使用On-CPU火焰图,如果是I/O或者锁造成的性能瓶颈则使用Off-CPU火焰图。
可以先查看一下CPU是不是快占满了,如果CPU占用不高,就用Off-CPU。
也可以使用压测工具查看是否能让CPU使用率趋于饱和,如果能,则使用On-CPU;如果不论怎样打压,CPU使用率始终上不来,那么大概率是由于I/O或者锁卡住了,此时使用Off-CPU较好。
实在拿不准的情况下,也可以两种都试试,一般情况下两者的差异比较大,如果两张火焰图长得差不多,那么很有可能是CPU被其他进程抢占了。
分析技巧
- 纵轴代表调用栈深,即栈帧数,展示了函数调用关系:下面的调用上面的;
- 横轴代表调用频次,格子的宽度越大,越说明可能是瓶颈的原因(但要注意横轴不代表事件);
- 一些无意义的事:横向排列的函数的先后顺序没实际意义、火焰图中格子的颜色只是为了视觉上的区分,颜色深浅无实际意义。
火焰图的生成
先贴个图上来,具体内容明天 下次再写吧。
下节预告:perf、FlameGraph、stackcollapse、采集堆栈、折叠堆栈…