WSL2でプロファイルツール(samply)を設定する

WSL2 上で samply でプロファイルを行う

CPU実験で RISC-V シミュレータを書いていた際、高速化のためプロファイルでボトルネックを特定したくなった。 ところで普段使いの Ubuntu + WSL2 だと、プロファイラを動かすまでにハマったのでメモ。

プロファイルツール

プログラムが Rust 製だったので、ググって以下の記事を参照した。 nnethercote.github.io

ここで WSL2 という制約に阻まれるツールが多かった。

プロファイラは perf というツールを使用しているものが多いが、デフォルトの WSL2 だと perf が上手く動作しない。カーネルと深い関係があるらしい? わからんけど。

perf と WSL2

WSL2-Linux-Kernelから perf を入れることが可能らしい。

github.com

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 してきてビルドすれば回避できる。

github.com

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くらいにはなったのでよかったです。