火焰图

概念

什么是火焰图

火焰图是分层数据的可视化,旨在可视化已分析软件的堆栈跟踪,以便快速准确地识别最频繁的代码路径。

原理

  1. 在讲火焰图之前,先说一说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不仅可以合并相同的堆栈跟踪样本,还可以合并堆栈跟踪的子集。这以树视图的形式显示,每个代码路径分支的计数或百分比,如图:

    image

    但是当前几个最频繁采样的堆栈信息不满足需要时,浏览更多堆栈跟踪将变得异常困难,如图:
    image

  2. 火焰图本质是通过不断的采样,将收集到的采样结果以图片的方式呈现。火焰图是基于性能分析工具(例如 perf、DTrace)的结果产生的 SVG 图片.

  3. 火焰图可以从任何包含堆栈跟踪的配置文件数据生成,包括以下分析工具

    • 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:比较代码变化前后系统性能的差异之处

如何生成火焰图

如何分析火焰图

  1. 火焰图的特点

    • 每个框代表栈里的一个函数。
    • Y轴表示栈深度。顶部的框表示在CPU上执行的函数。下面的都是它的祖先调用者。函数下面的函数即是其父函数。
    • X轴横跨整个取样函数。从左往右代表时间的流逝,其左右顺序没有任何含义(按字母顺序)
    • 框的宽度表示函数在CPU上运行,或者是他的上级函数在CPU上运行的时间。更宽的函数框可能比窄框函数慢,也可能是因为只是很频繁地被调用。
    • 如果是多线程运行,而且抽样是并发的情况,抽样计数可能会超过总时间。
  2. 火焰图实例
    image

参考资料:

  1. https://www.brendangregg.com/flamegraphs.html
  2. https://queue.acm.org/detail.cfm?id=2927301
  3. http://www.ruanyifeng.com/blog/2017/09/flame-graph.html
  4. 《性能之巅:洞悉系统、企业与云计算》Brendan Gregg
posted @ 2021-11-23 11:11  可以书  阅读(588)  评论(0编辑  收藏  举报