转载

一分钟理解火焰图

在对项目进行性能检测的时候,发现热点代码是一件重要且很有意义的事情,我们可以通过性能检测的数据,比如火焰图,找到代码中应该要优化的点,及早发现代码的性能瓶颈。

从本文中你会了解到:async-profiler工具的安装及使用、如何生成火焰图、以及如何看火焰图。

本文所有的演示都是基于JAVA的。

async-profiler工具的安装:

克隆async-profiler:

# git clone https://github.com/jvm-profiling-tools/async-profiler

安装gcc:

# yum install -y gcc gcc-c++ autoconf automake

编译:

# cd async-profiler

# make

async-profiler的安装是少有的非常简单,当然如果懒,不想敲上面的一堆命令,也可以直接下载编译后的文件,链接如下:

https://github.com/jvm-profiling-tools/async-profiler/releases/download/v1.4/async-profiler-1.4-linux-x64.tar.gz

async-profiler工具的使用:

通过jps命令,找到要监控的java进程PID,通过如下两个命令可以进行取样:

开始取样

# ./profiler.sh start PID

结束取样

# ./profiler.sh stop PID

当stop的时候,会打印如下内容:

一分钟理解火焰图

生成火焰图:

下载FlameGraph,火焰图就是通过这个工具生成的

# git clone https://github.com/brendangregg/FlameGraph.git

采集10秒钟数据

# sh profiler.sh -d 10 -o collapsed -f /tmp/data.txt PID

生成火焰图

# FlameGraph/flamegraph.pl --colors=java /tmp/data.txt > /tmp/flamegraph.svg

如何看火焰图:

将生成的svg文件拖到浏览器中就可以查看。

火焰图就是看顶层的哪个函数占据的宽度最大。只要有 “平顶”(plateaus), 就表示该函数可能存在性能问题。他们的颜色并没有特殊含义。

正常的火焰图形状类似的“山脉”,“山脉”的“海拔”表示业务函数的调用深度,“山脉”的“长度”表示业务函数占用cpu的比例。如下图:

一分钟理解火焰图

另外一个对比是下图,可以看到 get_serial_id 这个函数占用了绝大部分的 CPU 比例,问题的排查可以从这里入手,找到其调用栈中异常的函数。

一分钟理解火焰图

一般来说一个正常的火焰图看起来像一座座连绵起伏的“山峰”,而一个异常的火焰图看起来像一座“平顶山”

如果您觉得本文对您有帮助,请关注微信公众号 “大熊的技术轶事”,长期更新更多技术干货

一分钟理解火焰图

原文  https://mp.weixin.qq.com/s/y9SUgqZ-A0u2P9NQ6BlgSA
正文到此结束
Loading...