Rustのフレームグラフ・ジェネレータ:flamegraphメモ [blessed.rsシリーズ17]
概要
こちらのリストにあるものを見て書いたメモになります。
今回はflamegraphについてです。
flamegraphとは
Rust製のフレームグラフ・ジェネレータ。
フレームグラフとは?
こちらが参考になった。
また、flamegraphのリポジトリ内では以下で説明がある。
また、flamegraphは、Linuxではperfを、それ以外ではdtraceを使用して解析を行い、その結果からSVGを作成している。
この解析を行うツールであるperfについては以下が参考になった。
install (WSL2環境)
基本的には以下でinstallを行う。
cargo install flamegraph
ただし、Linuxではperfを、それ以外ではdtraceを使用するため、これらのツールが環境に入っている必要がある。
詳細は上記URL参照。
以下は、WSL2での環境構築方法になる。
まず、WSL2では、apt-getなどを使用する方法ではprefをインストールすることができないため、以下の記事のようにする必要がある。
途中で以下のようなエラーが出るかもしれない。
fatal error: Python.h: No such file or directory
2 | #include <Python.h>
| ^~~~~~~~~~
compilation terminated.
error: command '/usr/bin/gcc' failed with exit code 1
cp: cannot stat 'python_ext_build/lib/perf*.so': No such file or directory
make[2]: *** [Makefile.perf:632: python/perf.so] Error 1
make[1]: *** [Makefile.perf:238: sub-make] Error 2
make: *** [Makefile:70: all] Error
この場合は以下の記事のように行う。
(私の環境ではpython3.9-devをinstallすれば動いた。-Iオプションでの指定は必要ない)
CPUイベントへのアクセス権限
CPUイベントへのアクセス権限がないと、perfによる解析ができないため、flamegraph使用時にエラーになる。
flamegraphを使用する際に、上記リンクの方法で一時的に設定を上書きするのがいいかもしれない。
(私の環境では、とりあえず値を 1 にしたところflamegraphを動かすことができたが、デフォルトの 2 のままだとエラーになった)
使い方
直接flamegraphを使う方法とcargoを使う方法がある。
$ flamegraph -- file
$ cargo flamegraph
直接flamegraphを使用する場合は、実行するファイルを上記のように指定する。
一方cargoを使用する場合は、上記の書き方でcargo run --releaseを実行した場合の解析ができる。
できることは基本同じだが、cargoを使用した方法の場合、例えば以下のようなことができる。
-
--devをつけると開発用のビルドが行われる -
--bin=fileか--bin fileでsrc/bin/fileを実行できる -
--bench benchmarkでbenches/benchmarkを実行できる -
--example exampleでexamples/exampleを実行できる -
--unit-test testで単体テストを実行できる -
--test test_nameで統合テスト(tests/test_name)を実行できる
また、両方に共通することだと、以下などのオプションがある
-
-o output_name.svgで出力ファイル名を変えられる(デフォルトはflamegraph.svg) -
--no-inlineでperfが行うどの関数がインライン化されているかの計算を停止する(これを行うのに結構時間がかかるので不必要ならオフにできる) -
-- argumentsでcargo runに渡す引数を指定できる- 直接flamegraphを実行の場合は
flamegraph -- file arguments
- 直接flamegraphを実行の場合は
-
-c "option1 option2"でperf/dtraceに"option1 option2"をわたすことができる
その他の参考
Discussion