最近接到1个任务,就是调研公司的业务框架接入zipkin之后,为啥CPU飙升。 靠猜测显然不行,那就用工具来说话,从武器库中找到 【火焰图】,下面开始研究怎么安装! =================
最近接到1个任务,就是调研公司的业务框架接入zipkin之后,为啥CPU飙升。
靠猜测显然不行,那就用工具来说话,从武器库中找到 【火焰图】,下面开始研究怎么安装!
======================================================
http://www.brendangregg.com/perf.html --- 工具!
http://www.brendangregg.com/flamegraphs.html --- 根据任务类型选择对应的页面
http://www.brendangregg.com/FlameGraphs/cpuflamegraphs.html --- 解决CPU飙升的问题
http://www.brendangregg.com/FlameGraphs/cpuflamegraphs.html#Java --- 解决java的CPU飙升
http://www.brendangregg.com/FlameGraphs/cpu-bash-flamegraph.svg --- 作者给的1个示例
https://github.com/brendangregg/FlameGraph --- 参数控制!
=======================开始安装===========================
1)安装perf-map-agent
yum install cmakeexport JAVA_HOME=自己的java位置mkdir .perf-map-agentcd .perf-map-agent/git clone --depth=1 https://github.com/jvm-profiling-tools/perf-map-agentcd perf-map-agent/cmake .执行cmake的时候报错,如果你碰到了这个问题,自己解决,我是这么解决的===========================yum groupinstall "Development Tools"yum install make===========================make成功,如下图所示
2. profiling and flame graph generation
git clone --depth=1 https://github.com/brendangregg/FlameGraph --- 里面sudo bashperf record -F 49 -a -g -- sleep 30; ./FlameGraph/jmaps发现没有perf命令,在centos下执行下面的命令=================================================yum install perf*=================================================确保在自己的正确目录下,比如/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.131-3.b12.el7_3.x86_64/.flamegraph再次执行这个命令perf record -F 49 -a -g -- sleep 30; ./FlameGraph/jmaps
可以执行perf命令,但是报错了,错误如下:
perf record -F 49 -a -g -- sleep 30; ./FlameGraph/jmaps[ perf record: Woken up 1 times to write data ][ perf record: Captured and wrote 0.793 MB perf.data (5880 samples) ]ERROR: AGENT_HOME not set correctly; edit ./FlameGraph/jmaps and fix
先解决这个问题,打开jmaps,查看,原来它的默认文件夹和我的文件夹不是同1个
AGENT_HOME=/usr/lib/jvm/perf-map-agent # from https://github.com/jvm-profiling-tools/perf-map-agent
修改成我的即可, 然后就不报错了,继续执行
perf record -F 49 -a -g -- sleep 30; ./FlameGraph/jmaps[ perf record: Woken up 1 times to write data ][ perf record: Captured and wrote 0.786 MB perf.data (5880 samples) ]Fetching maps for all java processes...Mapping PID 12196 (user root):wc(1): 10973 33604 806238 /tmp/perf-12196.map
perf script > out.stacks01cat out.stacks01 | ./FlameGraph/stackcollapse-perf.pl | grep -v cpu_idle | / ./FlameGraph/flamegraph.pl --color=java --hash > out.stacks01.svg
然后就生成了下面的图
3 精细化参数控制
https://github.com/brendangregg/FlameGraph
=================命令参数解析===================
perf record -F 99 -a -g -- sleep 60; ./FlameGraph/jmaps
--- -F 99 --- 采样频率 99赫兹
--- -a --- 采样所有进程
--- 60是 60秒的意思
如果仅仅只针对某个进程采样,命令如下:
perf record -F 99 -p 进程ID -g -- sleep 60; ./FlameGraph/jmaps
4 新的问题
没有显示代码的顶层栈,奇怪,找文章看,只要在JVM启动参数里加上
-XX:+PreserveFramePointer --- 加上这个选项,再测试看看
顺便也加上这个 -XX:+NoOmitFramePointer
果然可以了,效果如下。
右下角还可以看到占比56.8%