使用perf 分析优化java应用。
要求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, 16CPUs)
-------------------------------------------
?
???????????? 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的改进吧。