应用perf 分析优化java应用
Perf 是用来进行软件性能分析的工具。它随 Linux 内核代码一同发布和维护,由内核社区维护和发展。
这里推荐两篇介绍 perf 的文章
英文原版的介绍
https://perf.wiki.kernel.org/index.php/Tutorial
中文的使用介绍
http://www.ibm.com/developerworks/cn/linux/l-cn-perf1/index.html
http://www.ibm.com/developerworks/cn/linux/l-cn-perf2/index.html
以上的介绍,都是分析直接运行在操作系统层面的应用,对于 java 这类运行在虚拟机里的应用, perf 再强大也无能为力。不过幸运的是,我们团队的高人对 perf 打了 patch ,为了区别于perf, 我们 先称它为 tperf 吧,对 jdk 也打了 patch ,这样就能够使用 tperf 来分析 java 的应用了。下面介绍一下如果用 tPerf 分析 java 应用。
- 1. 准备
要求 kernel 版本在 2.6.32 及以上, jdk 为 taobao-jdk 6u32 及以上
- 2. 运行实例
在运行 java 时,需要添加两个选项 -agentpath:/xxx/libjvmti_perf.so.0.0 -XX:+UseOprofile, agentpath 是修改后 perf 工具中 agent 库。
然后 sudo perf top 即可看到实时的分析结果数据。
以 gcbench 为例,运行结果如下。
-------------------------------------------
PerfTop: 1083 irqs/sec kernel: 8.8% exact: 0.0% [1000Hz cycles], (all, 16 CPUs)
-------------------------------------------
samples pcnt function DSO
_______ _____ _____________________________ ______________________
4102.00 38.1% LGCBench;Populate(ILNode;)V hs-vm-3612-1 (deleted)
3562.00 33.1% LGCBench;MakeTree(I)LNode; hs-vm-3612-1 (deleted)
880.00 8.2% PSMarkSweepDecorator::precomp libjvm.so
716.00 6.7% instanceKlass::oop_adjust_poi libjvm.so
487.00 4.5% instanceKlass::oop_follow_con libjvm.so
208.00 1.9% intel_idle [kernel.kallsyms]
182.00 1.7% PSMarkSweepDecorator::adjust_ libjvm.so
161.00 1.5% MarkSweep::follow_stack() libjvm.so
119.00 1.1% PSMarkSweepDecorator::compact libjvm.so
55.00 0.5% __GI_memmove /lib64/libc-2.5.so
43.00 0.4% CardTableExtension::scavenge_ libjvm.so
42.00 0.4% SpinPause libjvm.so
31.00 0.3% _wordcopy_fwd_aligned /lib64/libc-2.5.so
27.00 0.3% clear_page_c [kernel.kallsyms]
23.00 0.2% StealTask::do_it(GCTaskManage libjvm.so
通过结果我们可以看到,里面既有 java 方法,又有 c 的方法。排在前两位的就是 java 方法,这个 java 工程师比较喜欢了,可以从这里入手尝试去优化 java 应用。
- 3. 讨论
目前来看, tperf 可以帮助 java 工程师解决一些问题,但是 tperf 本身也存在一些问题,目前对 top 的支持较好,对 record 的支持还是存在问题的,我就用 record 搞挂过几次机器。期待后续我们团队大牛对 tperf 的改进吧。