プロファイリング

Note

このドキュメントのレシピ・セクションは、基礎についての説明を最小限にとどめ、目標に焦点を当てている。

目的

sbt が何に時間を費やしているかを理解するためにプロファイリングを行いたい。

解決策: トレース

  1. 既存のサーバーがあればシャットダウンする: sbt shutdown
  2. --server --traces を付けてコマンドを実行する
$ sbt --server --traces compile
....
$ ls target/traces/build.trace
target/traces/build.trace

これにより Chrome トレースファイル target/traces/build.trace が生成される。Perfetto で開くことができ、各タスクにかかった時間を確認できる。

解決策: タイミング

  1. 既存のサーバーがあればシャットダウンする: sbt shutdown
  2. --server --timings を付けてコマンドを実行する
$ sbt --server --timings compile
....
Total time: 4116 ms
  aaa-build / Compile / compileIncremental      : 731 ms
....

タスクのタイミング情報をターミナルに出力する。

解決策: フレームグラフ

async-profiler をインストールし、asprofjfrconvPATH に追加する:

$ 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. プロファイリングに影響する可能性のあるものを閉じ、1つのターミナルで sbt を実行する

  2. 別のターミナルで jps を実行して sbt のプロセス ID を確認する

    $ jps
    92746 sbt-launch.jar
    92780 Jps
    
  3. 継続時間フラグを付けて asprof を実行する。-d 60 は 60秒を意味する:

    $ asprof -d 60 -f /tmp/flamegraph.jfr <process id>
    

    これにより JFR (Java Flight Recorder) ファイルが生成される。

  4. *.jfr ファイルをフレームグラフに変換するため、以下のように jfrconv を実行する:

    $ jfrconv --lines /tmp/flamegraph.jfr /tmp/flamegraph.html
    

代替手段: JVM プロファイリング

VisualVM のようなプロファイラーを使って、実装レベルのタイミングを特定することができる。

  1. 既存のサーバーを全てシャットダウンする: sbt shutdownall
  2. --server を付けて sbt セッションを開始する
  3. VisualVM を起動して、xsbt.boot.Boot をダブルクリックする
  4. Sampler タブに移動して、CPU をクリックする
  5. sbt シェル内でコマンドを実行する
  6. Sampler タブの Stop ボタンをクリックする

pool-n-thread-m という名前のスレッドがタスクスレッドだ。