为什么80%的码农都做不了架构师?>>>
摘要
火焰图是分析应用性能问题很好的工具,只是网上的文章都是讲述分析 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 栈的信息很模糊,不可用。
参考网址
- 使用linux perf工具生成java程序火焰图
- Linux下用火焰图进行性能分析
- perf CPU Sampling
- How to Install perf Tool on CentOS and Ubuntu
- gen.sh, profile.sh