ablog

不器用で落着きのない技術者のメモ

Amazon Linux 2 で Java Mixed-Mode Flame Graphs を使う手順

Amazon Linux 2 でサクッと Java Mixed-Mode Flame Graph でプロファイリングして可視化する手順。以下は生成した Flame Graph。
f:id:yohei-a:20200904103123p:plain
f:id:yohei-a:20200904103247p:plain

環境

  • Amazon Linux release 2 (Karoo)
    • Kernel 4.14.186-146.268.amzn2.x86_64
  • OpenJDK 1.8.0
    • java-1.8.0-openjdk-1.8.0.252.b09-2.amzn2.0.1.x86_64

準備

インストール手順
  • パッケージのインストール
$ sudo yum install -y perf git cmake gcc gcc-c++
$ sudo yum -y install java-1.8.0-openjdk-devel.x86_64
  • perf-map-agent のインストール
$ git clone https://github.com/jvm-profiling-tools/perf-map-agent.git
$ export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.252.b09-2.amzn2.0.1.x86_64/
$ cd perf-map-agent
$ cmake .
$ make
サンプル Java プログラムの作成
  • InfinitePrint.java
public class InfinitePrint {
	public static void main(String[] args){
		int i = 0;
		while(true) {
			i++;
			System.out.println("count: " + i);
		}
	}
}
$ javac InfinitePrint.java

Java Mixed-Mode Flame Graph の生成

  • Java プログラムを実行する
$ java -XX:+PreserveFramePointer InfinitePrint > /dev/null &
[1] 9875 # この PID をこのあとの手順で使用
  • perf で情報採取する
    • -F 99: 1秒間に99回サンプリングする
    • -p: PID を指定
    • -g: コールグラフを生成
    • -sleep 60: 60 秒間プロファイリング
$ cd perf-map-agent # 以降の手順は perf-map-agent のホームディレクトリで実行
$ perf record -F 99 -p 9875 -g -- sleep 60
  • /tmp/.map を生成する
$ bin/create-java-perf-map.sh 9875
  • トレース(テキスト)を生成する
$ perf script > out.perf
  • Flame graph を生成する
$ git clone --depth 1 https://github.com/brendangregg/FlameGraph.git
$ ./FlameGraph/stackcollapse-perf.pl out.perf > out.folded
$ ./FlameGraph/flamegraph.pl out.folded > graph.svg