Chapter 11

プロファイリングを行う (cargo-flamegraph)

ferrous-systems/flamegraphを使ってRustプログラムの性能評価を行っていきます。

image.png
eom/example/benchのベンチマーク結果です)

FlamgeGraphと呼ばれる関数の呼び出しと個々の関数での実行時間を一度に表示したものです。

FlameGraphに関する説明は以下が詳しいです

Install

cargo install flamegraph

これでflamegraph, cargo-flamegraphがインストールされます。flamegraphは背後でperfを外部プロセスとして実行するのでperfを入れておく必要があります。

ubuntu/debian

linux-toolsをインストールします。これはカーネルによって適切なものが変わるので注意してください。

sudo apt install linux-tools

とすると候補が出るのでその中から適切なものを選んでください。私の場合はGCP上の仮想マシンだったのでlinux-tools-gcpをインストールしました。

RedHat/CentOS/Fedora

sudo yum install perf

Windows

未調査です…

Usage

cargo flamegraph

cargo run --releaseの結果をプロファイルしてくれて結果を flamegraph.svg を生成してくれます。-o another_name.svg のようにすると別名で保存してくれます。また背後でperfを実行するのでperf.dataも作られますが、自分で触る必要はありません。

Cargo.toml
[profile.release]
debug = true

のようにすると関数の情報をある程度残したまま最適化するので結果が見やすくなります。

How to Read

image.png
Blazing Performance with Flame Graphsより引用

  • 関数の呼び出しのスタックに応じて関数を縦に積み上げて、関数での消費時間に応じて横幅を定めます
  • a()の実行の中で、実際にどの関数で時間を消費しているかは一番上の端を見ればいい(上図の太い部分)。上図ではf(), d(), e(), h()の順に時間を消費している。