大部分情况下,在进程级的性能优化,通过查看系统CPU、内存资源等基本都能定位到性能问题,定点解决,但是当你去帮别人做性能排查定位的时候,你不熟悉代码的情况,最快速的就是通过火焰图迅速输出系统调用栈的详细信息,分析出耗时的方法调用。
在JAVA开发过程中,通过visualvm的cpu抽样和内存抽样就可以达到上述效果,CPU抽样的堆栈就可以看出线程的调用关系,最后一层往往都是JDK的api调用,在这个过程中,基本就能定位到自己的哪个方法比较耗时了,但是如果光通过JDK的api还看不出问题,那就需要通过火焰图来看系统调用了,做更深次的性能分析。
安装perf工具
yum install -y perf
perf top -p pid
perf常用参数:
top:动态时实追踪显示占用CPU较高的进程
record:由于top只能实时查看不能保存,不便于事后分析,用此参数保存追踪的内容,文件名为perf.data
report:重放perf.data的内容
perf record常用参数:
-p:指定追踪进程的PID
-g:启用进程中函数的调用关系(CPU使用超过0.5%时,才会显示调用栈,可以通过man查看)
-a:追踪所有的CPU的
sleep N:采集多长时间的数据(如:perf record -ag sleep 10;perf report,直接采集10数据并分析)
上述是基本的perf工具使用方法,详情见perf help
如何生成火焰图?
第一步
perf record生成data文件
第二步
perf script -i perf.data &> perf.unfold
第三步
/apprun/FlameGraph/stackcollapse-perf.pl perf.unfold &> perf.folded
(先clone --> git clone https://github.com/brendangregg/FlameGraph)
第四步
/apprun/FlameGraph/flamegraph.pl perf.folded > perf.svg
第五步
sz perf.svg
通过浏览器打开svg文件
颜色没有特殊含义, 因为火焰图表示的是 CPU 的繁忙程度, 所以一般选择暖色调.