火焰图

perf record -a -g -p 65269 -F 99 -- sleep 30
perf record -a -g -p 65269 -- sleep 30    (-p 后是pid号)
perf report -n --stdio (按cpu消耗降序全面展开)
perf report  -i perf.data (按cpu消耗收起来展示,这个比较好用)


perf record -F 99 -p 进程ID  -g -- sleep 60; ./FlameGraph/jmaps  (使用jmaps脚本,自动的为所有Java进程创建符号文件
)

首先用 perf script 工具对 perf.data 进行解析

# 生成折叠后的调用栈
perf script -i perf.data &> perf.unfold

将解析出来的信息存下来, 供生成火焰图,首先用 stackcollapse-perf.pl 将 perf 解析出的内容 perf.unfold 中的符号进行折叠 :

# 生成火焰图
./stackcollapse-perf.pl perf.unfold &> perf.folded

最后生成 svg 图

./flamegraph.pl perf.folded > perf.svg

我们可以使用管道将上面的流程简化为一条命令

perf script | FlameGraph/stackcollapse-perf.pl | FlameGraph/flamegraph.pl > process.svg

下载perf-map
http://www.github.com/jvm-profiling-tools/perf-map-agent

解压
进入解压后的目录
安装cmake
https://blog.csdn.net/hometing218/article/details/79516686

git clone https://github.com/jvm-profiling-tools/perf-map-agent
cd perf-map-agent
yum install cmake
yum install gcc
yum install gcc-c++
cmake .
make

必须确保jdk为1.8才能安装成功

同 jmaps 为java进程创建符号表 生成java堆栈的火焰图
java -cp attach-main.jar:$JAVA_HOME/lib/tools.jar net.virtualvoid.perf.AttachOnce PID    
sudo chown root /tmp/perf-*.map

没有显示代码的顶层栈,奇怪,找文章看,只要在JVM启动参数里加上

-XX:+PreserveFramePointer --- 加上这个选项,再测试看看

顺便也加上这个 -XX:+NoOmitFramePointer

果然可以了,效果如下。

perf record -F 99 -p 进程ID -g -- sleep 60; ./FlameGraph/jmaps

执行前要设置perf-map的环境变量
export AGENT_HOME=/home/admin/tools/perf-map-agent-master

参考文献
https://www.jianshu.com/p/bea2b6a1eb6e
https://my.oschina.net/qiangzigege/blog/1301752

你可能感兴趣的:(火焰图)