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はアルファベット順でソートされています。

おわり。