Amazon Linux 2 でサクッと Java Mixed-Mode Flame Graph でプロファイリングして可視化する手順。以下は生成した Flame Graph。
- Java Mixed-Mode Flame Graphs について詳しくは Java Mixed-Mode Flame Graphs で Java の CPU ネックをフルスタックで分析する - ablog、
- Flame Graphs の見方については perf + Flame Graphs で Linux カーネル内のボトルネックを特定する - ablog を参照。
環境
準備
インストール手順
- パッケージのインストール
$ 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 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