WSL2 上で samply でプロファイルを行う
CPU実験で RISC-V シミュレータを書いていた際、高速化のためプロファイルでボトルネックを特定したくなった。 ところで普段使いの Ubuntu + WSL2 だと、プロファイラを動かすまでにハマったのでメモ。
プロファイルツール
プログラムが Rust 製だったので、ググって以下の記事を参照した。 nnethercote.github.io
ここで WSL2 という制約に阻まれるツールが多かった。
プロファイラは perf というツールを使用しているものが多いが、デフォルトの WSL2 だと perf が上手く動作しない。カーネルと深い関係があるらしい? わからんけど。
perf と WSL2
WSL2-Linux-Kernelから perf を入れることが可能らしい。
Install perf on WSL 2 · GitHub に沿って試してみたが、2023年12月ごろだとなんかエラーが起きて失敗した。
なので perf が必要なツールは諦める。上で紹介されていた中では flamegraph とか良さそうだったけど。
samply
GitHub - mstange/samply: Command-line sampling profiler for macOS and Linux
Rust 製のサンプリングツール。 実行すると Firefox profiler というやつが開いてグラフなどが見られる。
perf は必要ないっぽい。 自分の場合ハマりどころは3つあった。
Os Error 1
Failed to start profiling: Operation not permitted (os error 1)
これを解決するのに一番時間がかかった。
cargo install
で簡単に使えるようになるのだが、その方法で入れるとエラーが出るっぽい。
GitHub のソースを clone してきてビルドすれば回避できる。
git clone git@github.com:mstange/samply.git cargo build -r
として、target/release/
下に生成された samply
を用いる。
perf_event_paranoid を直す
これは丁寧に打つべきコマンドを書いてくれた。
'/proc/sys/kernel/perf_event_paranoid' is currently set to 2. In order for samply to work with a non-root user, this level needs to be set to 1 or lower. You can execute the following command and then try again: echo '1' | sudo tee /proc/sys/kernel/perf_event_paranoid
mmap Failed エラー
これは README.md
に書いてあった。
sudo sysctl kernel.perf_event_mlock_kb=2048
使い方のコツ
README.md
の通りにやればよい。
特に Rust プログラムをプロファイルしたい場合、デフォルトの release
ビルドだと debug
がオフになっているため、 debug
をオンにした cargo profile
でコンパイルすると良い。
感想
実際使って直したら実行時間1/2くらいにはなったのでよかったです。