火焰图
概念
什么是火焰图
火焰图是分层数据的可视化,旨在可视化已分析软件的堆栈跟踪,以便快速准确地识别最频繁的代码路径。
原理
-
在讲火焰图之前,先说一说perf:
perf是一款linux内置的基于内核的性能分析工具,perf工具提供了一套丰富的命令来收集和分析性能并跟踪数据。perf可以完成对堆栈跟踪的采样。
$ sudo perf record -F 99 -p 13204 -g -- sleep 30
上面的代码中,perf record表示记录,-F 99表示每秒99次,-p 13204是进程号,即对哪个进程进行分析,-g表示记录调用栈,sleep 30则是持续30秒。下面是一次的采样结果:
SpinPause StealTask::do_it GCTaskThread::run java_start start_thread
如果一台服务器有16个 CPU,每秒抽样99次,持续30秒,就得到 47,520 个调用栈,长达几十万甚至上百万行。
幸运的是,perf不仅可以合并相同的堆栈跟踪样本,还可以合并堆栈跟踪的子集。这以树视图的形式显示,每个代码路径分支的计数或百分比,如图:
但是当前几个最频繁采样的堆栈信息不满足需要时,浏览更多堆栈跟踪将变得异常困难,如图:
-
火焰图本质是通过不断的采样,将收集到的采样结果以图片的方式呈现。火焰图是基于性能分析工具(例如 perf、DTrace)的结果产生的 SVG 图片.
-
火焰图可以从任何包含堆栈跟踪的配置文件数据生成,包括以下分析工具
- Linux: perf, eBPF, SystemTap, and ktap
- Mac OS X: DTrace and Instruments
- Windows: Xperf.exe3. perf
- Solaris, illumos, FreeBSD: DTrace
解决了什么问题
火焰图包含以下种类:
- CPU:找出cpu占用高的问题函数;分析代码热路径
- Memory:内存泄漏问题;内存占用高的对象/申请内存多的函数;虚拟内存或物理内存泄漏问题
- Off-CPU:i/o、网络等阻塞场景导致的性能下降;锁竞争、死锁导致的性能下降问题
- Hot/Cold:需要结合cpu占用以及阻塞分析的场景;off-cpu火焰图无法直观判断的场景
- Differential:比较代码变化前后系统性能的差异之处
如何生成火焰图
-
perf + 火焰图生成工具(https://github.com/brendangregg/FlameGraph.git)
-
arthas (profiler 命令)
Docker下使用arthas生成火焰图报错的解决办法:https://www.cnblogs.com/icanwrite/p/15592336.html
如何分析火焰图
-
火焰图的特点
- 每个框代表栈里的一个函数。
- Y轴表示栈深度。顶部的框表示在CPU上执行的函数。下面的都是它的祖先调用者。函数下面的函数即是其父函数。
- X轴横跨整个取样函数。从左往右代表时间的流逝,其左右顺序没有任何含义(按字母顺序)
- 框的宽度表示函数在CPU上运行,或者是他的上级函数在CPU上运行的时间。更宽的函数框可能比窄框函数慢,也可能是因为只是很频繁地被调用。
- 如果是多线程运行,而且抽样是并发的情况,抽样计数可能会超过总时间。
-
火焰图实例
参考资料: