Flame Graph 火焰图分析 Java 性能

原创
2019/02/24 16:56
阅读数 1K

摘要

火焰图是分析应用性能问题很好的工具,只是网上的文章都是讲述分析 C, C++ 等语言的,对Java 语言描述甚少,此处记录一下自己使用火焰图分析Java 栈的过程。

环境

Linux: centos6 jdk: 1.7

步骤

火焰图是性能大神 brendangregg 创造的,我们使用的脚本在他的github 上 https://github.com/brendangregg/FlameGraph.git , 将项目clone 到本地,进入到 FlameGraph 文件夹中,创建两个文件(文件来自mik01aj 的gist,稍微修改了一下)

profile.sh:

#!/bin/sh

# Usage: ./profile.sh pid output.txt

PROFILED_PID=$1
OUTPUT_FILE=$2

echo "Getting stacktraces from process $PROFILED_PID... Will stop on ^C or when the process exits."

rm -f "$OUTPUT_FILE"

while true; do
    jstack "$PROFILED_PID" >> "$OUTPUT_FILE" && sleep 0.01 || break
done

echo
echo "Done! Stacks saved to $OUTPUT_FILE"

gen.sh:

#!/bin/bash

# Usage: ./gen.sh collected-stacks.txt

TMPSTACKS=/tmp/flamegraph-stacks-collapsed.txt
TMPPALETTE=/tmp/flamegraph-palette.map

./stackcollapse-jstack.pl --no-include-tname $1 > $TMPSTACKS

# 1st run - hot: default
./flamegraph.pl --cp $TMPSTACKS > stacks.svg

# 2nd run - blue: I/O
cp palette.map $TMPPALETTE
cat $TMPPALETTE | grep -v '\.read' | grep -v '\.write' | grep -v 'socketRead' | grep -v 'socketWrite' | grep -v 'socketAccept' > palette.map
./flamegraph.pl --cp --colors=io $TMPSTACKS > stacks.svg

rm -f palette.map 
echo "Done! Now see the output in stacks.svg"

然后将stacks.svg 下载到本地,使用浏览器打开即可。

遇到的问题

本来参考了1 想使用perf 来生成采样信息,但是安装了一大堆东西之后,采样后的数据(采样脚本 perf record -F 99 -p 98498 -- sleep 30; ./jmaps)一直报perf file's data size field is 0 which is unexpected., 也没有找到解决办法,加上 -v 之后会打印一个 couldn't open /proc/21847/status的错误,不知道为什么会读取这个进行的状态,应该说只读取采样进程的状态就可以了。后来直接使用网上的命令perf record -F 99 -a -- sleep 30; ./jmaps,可以采样出来,但是生成的火焰图无法看,是系统栈与java栈混在一起而且 Java 栈的信息很模糊,不可用。

参考网址

  1. 使用linux perf工具生成java程序火焰图
  2. Linux下用火焰图进行性能分析
  3. perf CPU Sampling
  4. How to Install perf Tool on CentOS and Ubuntu
  5. gen.sh, profile.sh
展开阅读全文
打赏
0
3 收藏
分享
加载中
更多评论
打赏
0 评论
3 收藏
0
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部