使用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%

 

posted on 2019-01-24 10:35  进_进  阅读(703)  评论(0)    收藏  举报