使用perf工具的火焰图,查看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 cmake
export JAVA_HOME=自己的java位置 --这一步是给java设置java_home 环境变量,当然也可以不设置,可以通过echo $JAVA_HOME 打印出java_home 的值 若设置了
mkdir .perf-map-agent
cd .perf-map-agent/
git clone --depth=1 https://github.com/jvm-profiling-tools/perf-map-agent ---可以直接去这个地址下载,然后传到服务器中也行
cd 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 --- 里面最重要需要配置的文件是jmaps 文件,
sudo bash
perf 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,将AGENT_HOME 的值改为下面的结果
AGENT_HOME=/...../perf-map-agent/out # 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.stacks01
cat 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%
浙公网安备 33010602011771号