使用火焰图进行性能分析(一)

火焰图是一种用于分析程序性能的可视化工具,主要分为On-CPU和Off-CPU两类,分别用于分析CPU占用和阻塞情况。每个格子代表一个函数,宽度表示函数在采样中的频率,帮助识别性能瓶颈。内存火焰图则用于检测内存问题。选择使用哪种火焰图取决于性能瓶颈的类型。分析技巧包括关注栈深度和调用频次,以及理解横轴不表示时间而是调用频率。
摘要由CSDN通过智能技术生成

为什么会用到火焰图?火焰图能干那些事儿?

  1. 分析函数执行的频度;
  2. 分析哪些函数经常阻塞;
  3. 分析哪些函数频繁操作内存;

火焰图的主要特点:

  1. 每一列代表一个调用栈,每个格子代表一个函数;
  2. 纵轴呈现出栈的深度,按照各函数的调用关系自下而上排列;
  3. 最顶端的格子代表采样时正在占用CPU的函数;
  4. 横轴:采集到的调用栈的信息,按字母顺序从左到右依次排列;
  5. 每个格子的颜色是随机的,颜色深浅没具体意义;
  6. 火焰图主要有5种:On-CPU、Off-CPU、内存、红蓝、Hot/Cold火焰图(火焰图官方文档);
  7. On-CPU火焰图的横轴指CPU占用时间,Off-CPU火焰图的横轴代表阻塞时间;
  8. 采样的方式可以是单线程、多线程、多进程等。

注意:横轴不代表时间,宽度表示在采样过程中出现的频率:一个格子的宽度越大,表示这个函数被采集到的次数越多。亦即是该函数造成性能瓶颈的可能性越大。

火焰图类型简介

类型横轴意义适用场景采样方式
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被其他进程抢占了。

分析技巧

  1. 纵轴代表调用栈深,即栈帧数,展示了函数调用关系:下面的调用上面的;
  2. 横轴代表调用频次,格子的宽度越大,越说明可能是瓶颈的原因(但要注意横轴不代表事件);
  3. 一些无意义的事:横向排列的函数的先后顺序没实际意义、火焰图中格子的颜色只是为了视觉上的区分,颜色深浅无实际意义。

火焰图的生成

先贴个图上来,具体内容明天 下次再写吧。
下节预告:perf、FlameGraph、stackcollapse、采集堆栈、折叠堆栈…
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值