应用perf 分析优化java应用

使用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 的改进吧。