Java程序性能定位工具-火焰图
前言
Java火焰图是一种新的查看CPU利用率方式。今天就带大家一起使用来自Google大神的工具来生成火焰图。火焰图非常的直观,问题一目了然,希望有一天它能成为JAVA标准性能调优工具里面的一员。
下图所示的就是一个火焰图的样子。在这里附上一个地址,感性的同学可以打开这个地址体验下火焰图的动态效果。地址是:http://www.brendangregg.com/blog/images/2014/cpu-vertx-flamegraph.svg
在这里解释下图的看法,Y轴表示栈的深度,X轴的宽度表示样本的数量。每一个长方形表示一个栈的窗口。请注意,火焰图中的颜色不重要,只是为了方便观看,没有任何实际的意义。从左到右的顺序也无关紧要。
火焰图第一步-性能数据采集
使用lightweight-java-profiler这个开源的工具来收集CPU性能数据。目前这个工具还没有做到开箱即用的能力,因此需要自己动手来搞定。
1. 需要linux环境。
如果你的linux环境下没有git客户端,可以在其他机器上checkout出来工程,然后复制过来。
打包过程中还需要make工具,这个需要自己安装。
2. Checkout工程。
https://github.com/dcapwell/lightweight-java-profiler.git
3. 定制Makefile
根据你操作系统的情况,需要修改工程目录下的Makefile文件。在这里主要有两个地方需要修改:一是操作系统位数;二是要包含的路径。
4c4 < BITS?=32 --- > BITS?=64 49c49 < INCLUDES=-I$(JAVA_HOME)/$(HEADERS) -I$(JAVA_HOME)/$(HEADERS)/$(UNAME) --- > INCLUDES=-I$(JAVA_HOME)/$(HEADERS) -I$(JAVA_HOME)/$(HEADERS)/$(UNAME) -I/usr/include/x86_64-linux-gnu |
按照我的经验,只需要修改BITS参数即可,另外一个参数可不修改。
4. 定制性能采集参数
你可以按照自己的喜好去修改lightweight-java-profiler中的源代码来达到定制的目的。参数修改主要在src/globals.h文件中,下面就列出几个值得关注的地方:
// 每秒采集次数 static const int kNumInterrupts = 100; // 追踪的栈的最大深度 static const int kMaxStackTraces = 3000; // 栈的最大采集窗口数 static const int kMaxFramesToCapture = 128; |
5. 编译软件
执行命令 make all 并等待结束。
6. 安装到你的工程中
将工程下面的结果输出目录\build-{BITS}下面的liblagent.so文件拷贝到和你要测试的工程的同台机器上并记下路径。在JAVA启动命令中加入如下参数:
-agentpath:{按实际路径填写}/liblagent.so |
7. 运行你的工程
运行你的工程并对你的业务进行一些操作,一段时间后停止你的业务。注意:如果使用kill命令停止进程一定不要加额外的参数,使用 kill {进程号}即可,CPU采集数据会慢慢输出到工程当前目录,输出完成后进行停止。输出的文件名一般为:traces.txt
火焰图第二步-生成火焰图
这一步是基于上一步的traces.txt文件进行的。这个工具依赖于perl,因此开始之前请安装perl。
1. 克隆火焰图工具
git clone http://github.com/brendangregg/FlameGraph
cd FlameGraph
2. 生成火焰图
使用如下的命令生成火焰图:
./stackcollapse-ljp.awk < ../traces.txt | ./flamegraph.pl > ../traces.svg
其中第一个参数标识输入的性能数据文件的路径,第二个参数表示生成的火焰图文件的输出路径。
总结
火焰图对性能是有影响的,合理的调整参数对发现问题是有帮助的。