Flame Graph 火焰圖分析 Java 性能

摘要

火焰圖是分析應用性能問題很好的工具,只是網上的文章都是講述分析 C, C++ 等語言的,對Java 語言描述甚少,此處記錄一下本身使用火焰圖分析Java 棧的過程。html

環境

Linux: centos6 jdk: 1.7java

步驟

火焰圖是性能大神 brendangregg 創造的,咱們使用的腳本在他的github 上 https://github.com/brendangregg/FlameGraph.git , 將項目clone 到本地,進入到 FlameGraph 文件夾中,建立兩個文件(文件來自mik01aj 的gist,稍微修改了一下)linux

profile.sh:git

#!/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:github

#!/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 下載到本地,使用瀏覽器打開便可。ubuntu

遇到的問題

原本參考了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 棧的信息很模糊,不可用。centos

參考網址

  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
相關文章
相關標籤/搜索