在对项目进行性能检测的时候,发现热点代码是一件重要且很有意义的事情,我们可以通过性能检测的数据,比如火焰图,找到代码中应该要优化的点,及早发现代码的性能瓶颈。
从本文中你会了解到:async-profiler工具的安装及使用、如何生成火焰图、以及如何看火焰图。
本文所有的演示都是基于JAVA的。
克隆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
通过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 比例,问题的排查可以从这里入手,找到其调用栈中异常的函数。
一般来说一个正常的火焰图看起来像一座座连绵起伏的“山峰”,而一个异常的火焰图看起来像一座“平顶山”
如果您觉得本文对您有帮助,请关注微信公众号 “大熊的技术轶事”,长期更新更多技术干货