プロファイリング
目的
sbt が何に時間を費やしているかを理解するためにプロファイリングを行いたい。
解決策: トレース
- 既存のサーバーがあればシャットダウンする:
sbt shutdown --server --tracesを付けてコマンドを実行する
$ sbt --server --traces compile
....
$ ls target/traces/build.trace
target/traces/build.trace
これにより Chrome トレースファイル target/traces/build.trace が生成される。Perfetto で開くことができ、各タスクにかかった時間を確認できる。
解決策: タイミング
- 既存のサーバーがあればシャットダウンする:
sbt shutdown --server --timingsを付けてコマンドを実行する
$ sbt --server --timings compile
....
Total time: 4116 ms
aaa-build / Compile / compileIncremental : 731 ms
....
タスクのタイミング情報をターミナルに出力する。
解決策: フレームグラフ
async-profiler をインストールし、asprof と jfrconv を PATH に追加する:
$ ln -s $HOME/Applications/async-profiler-4.2/bin/asprof $HOME/bin/asprof
$ ln -s $HOME/Applications/async-profiler-4.2/bin/jfrconv $HOME/bin/jfrconv
-
プロファイリングに影響する可能性のあるものを閉じ、1つのターミナルで sbt を実行する
-
別のターミナルで
jpsを実行して sbt のプロセス ID を確認する$ jps 92746 sbt-launch.jar 92780 Jps -
継続時間フラグを付けて
asprofを実行する。-d 60は 60秒を意味する:$ asprof -d 60 -f /tmp/flamegraph.jfr <process id>これにより JFR (Java Flight Recorder) ファイルが生成される。
-
*.jfrファイルをフレームグラフに変換するため、以下のようにjfrconvを実行する:$ jfrconv --lines /tmp/flamegraph.jfr /tmp/flamegraph.html
代替手段: JVM プロファイリング
VisualVM のようなプロファイラーを使って、実装レベルのタイミングを特定することができる。
- 既存のサーバーを全てシャットダウンする:
sbt shutdownall --serverを付けて sbt セッションを開始する- VisualVM を起動して、
xsbt.boot.Bootをダブルクリックする - Sampler タブに移動して、CPU をクリックする
- sbt シェル内でコマンドを実行する
- Sampler タブの Stop ボタンをクリックする
pool-n-thread-m という名前のスレッドがタスクスレッドだ。