async profilerを試す
async profilerを試してみたメモです。
JVMのプロファイリングには今までjconsole、VisualVM、MATなどを使ってきましたが、
async profilerが便利らしいので素振りしておこうと思いました。
下記バージョンで試してみます。
- async-profiler 2.8
インストール
最新版を落としてきて解凍するだけです。
下記の公式のリポジトリから最新をダウンロードします。
Mac用のzipをダウンロードしました。
https://github.com/jvm-profiling-tools/async-profiler/releases
解凍すると、中にprofiler.sh
があります。
❯ unzip async-profiler-2.8-macos.zip
❯ cd async-profiler-2.8-macos
CPU profiling
Basic usageに従って、CPU profileを取ってみます。
https://github.com/jvm-profiling-tools/async-profiler/wiki/Basic-Usage
古いspring bootのアプリケーションを起動しておきます。
起動したアプリケーションのpidを確認
❯ jcmd 30994 jdk.jcmd/sun.tools.jcmd.JCmd 30891 org.jetbrains.idea.maven.server.RemoteMavenServer 30990 com.example.circuit.breaker.supplier.CircuitBreakerSupplierExampleApplication
spring bootアプリケーションのpidを指定してstart
で実行します。
-f
で出力ファイル名を指定します。
❯ ./profiler.sh start -f profile.html 30990
30秒くらいでstop
❯ ./profiler.sh stop -f profile.html 30990
-d
で指定した時間だけ取得することが出来ます。
-d 30
で30秒取得します。
❯ ./profiler.sh -d 30 -f profile2.html 30990 Profiling for 30 seconds Done
出力されたprofile.htmlをブラウザで見てみます。
ALLOCATION profiling
-e alloc
を指定することでヒープのallocationのprofileが取れます
❯ ./profiler.sh -e alloc -d 120 -f alloc.html 30990 Profiling for 120 seconds Done
出力されたalloc.htmlをブラウザで見てみます。
Flame Graph
Flame Graphはプロファイルされたデータを階層型のVisualizeで表示します。
https://www.brendangregg.com/flamegraphs.html
CPUのprofileのprofile.htmlを見てみます。
縦軸は呼び出しの階層で、上のものが下のものから呼ばれていることを表しています。
横軸は時間ではなく、stack profileの占有率を表していて、幅が広いほどstackに存在する頻度が高いことを表してます。
それそれのstackはアルファベット順でソートされています。
おわり。