Windows でのプロファイリング
WPR と WPA の紹介
高レベルのパフォーマンス分析(メモリ使用量を含む)は、Windows Performance Recorder (WPR) と Windows Performance Analyzer (WPA) を使って実行できます。 名前が示すとおり、WPR はシステム統計情報(イベント トレース ログ、別名 ETL ファイルの形式)を記録するためのものであり、WPA はこれらの ETL ファイルを分析するためのものです。
WPR はシステム全体の統計情報を収集するため、rustc に関連するものだけでなく、 そのマシン上で実行されている他のすべてのものも記録します。 分析中に、関心のあるものだけにフィルタリングできます。
これらのツールは非常に強力ですが、Rust コンパイラをうまくプロファイリングできるようになるには、 少し学習も必要です。
ここでは、Rust コンパイラを分析するために WPR と WPA を使用する方法を見ていくとともに、 rustc の分析を容易にするよう特別に設計された有用な「プロファイル」(つまり、WPR と WPA のデフォルトを調整する設定ファイル)へのリンクも提供します。
WPR と WPA のインストール
WPR と WPA は、Windows Assessment and Deployment Kit (ADK) のダウンロード時に選択できる Windows Performance Toolkit の一部としてインストールできます。 ADK インストーラーは こちらからダウンロードできます。 Windows Performance Toolkit を必ず選択してください(他には何も選択する必要はありません)。
記録
システム分析を実行するには、まず WPR でシステムを記録する必要があります。 WPR を開き、ウィンドウの下部で記録したいものの「プロファイル」を選択します。 rustc のブートストラップ プロセスのメモリ使用量を調べる場合は、以下の項目を選択します。
- CPU 使用率
- VirtualAlloc 使用状況
「Heap usage」も記録したくなるかもしれませんが、これはヒープ割り当てを 1 つ残らず記録するため、 非常に、非常に高コストになる可能性があります。 高レベルの分析では、これはオフのままにしておくのが最善かもしれません。
次に、記録するためのセットアップを準備する必要があります。 メモリ使用量の分析では、デバッグ シンボル付きの stage 1 コンパイラ ビルドを使って stage 2 コンパイラ ビルドを記録するのが最善です。 rustc のビルドに使用しているコンパイラにシンボルがあると、WPA が Rust のシンボルを正しく解決できるため、 分析に大いに役立ちます。 残念ながら、stage 0 コンパイラではシンボルが有効になっていないため、 stage 1 コンパイラをビルドし、 続いて stage 2 コンパイラを自分でビルドする必要があります。
これを行うには、bootstrap.toml ファイルで rust.debuginfo-level = 1 を設定していることを確認してください。
これにより、ブートストラップ時にスタック フレームを含むデバッグ情報を生成するよう rustc に指示します。
これで stage 1 コンパイラをビルドできます: x build --stage 1 -i library、または
stage 1 コンパイラをビルドしたい他の任意の方法でビルドしてください。
stage 1 コンパイラがビルドできたので、stage 2 ビルドを記録できます。
WPR に戻り、
「start」ボタンをクリックして stage 2 コンパイラをビルドします(例: x build --stage=2 -i library)。
このプロセスが完了したら、記録を停止します。
Save ボタンをクリックし、そのプロセスが完了したら、表示される「Open in WPA」ボタンをクリックします。
注: トレース ファイルはかなり大きいため、WPA がファイルを開き終えるまでに少し時間がかかることがあります。
分析
ETL ファイルが WPA で開かれたので、結果を分析できます。 まず、rustc のブートストラップ分析に適した状態に WPA を設定する、 事前作成済みの「プロファイル」を適用します。 プロファイルはこちらからダウンロードしてください。 上部の「Profiles」メニューを選択し、次に「apply」を選択して、ダウンロードしたプロファイルを選択します。
次のようなものが表示されるはずです。

次に、Rust のスタック トレースを適切にデマングルできるように、デバッグ シンボルを読み込んで処理するよう WPA に指示する必要があります。 これを行うには、「Trace」をクリックしてから「Load Symbols」を選択します。 この手順には時間がかかることがあります。
WPA が rustc のシンボルを読み込んだら、rustc.exe ノードを展開し、割り当てが最も大きいスタックを掘り下げていけます。
そのためには、「Commit Stack」列の [Root] ノードを展開し、興味深いスタック フレームが見つかるまで
展開を続けます。
ヒント: 展開したいノードを選択した後、右矢印キーを押します。これによりそのノードが展開され、 展開された集合内で次に大きいノードに選択が移動します。 興味深いフレームに到達するまで、右矢印キーを押し続けることができます。

このサンプルでは、このプロファイル全体を通して、codegen 経由の呼び出しが合計で約 30GB のメモリを割り当てていることがわかります。
その他の分析タブ
このプロファイルには、役立つ可能性のある他のタブもいくつか含まれています。
- System Configuration
- キャプチャが記録されたシステムに関する一般情報。
- rustc Build Processes
- rustc.exe、cargo.exe、link.exe などの関連プロセスのフラットな一覧。
- 各プロセスには、そのコマンドライン引数が表示されます。
- 特定の rustc プロセスが何に取り組んでいたかを把握するのに役立ちます。
- rustc Build Process Tree
- プロセスがいつ開始し終了したかを示すタイムライン。
- rustc CPU Analysis
- rustc のホットスポットを表示するように事前設定されたチャートが含まれています。
- これらのチャートは、rustc がどこで時間を費やしているかを分析することを支援するよう設計されています。
- rustc Memory Analysis
- rustc がどこでメモリを割り当てているかを表示するように事前設定されたチャートが含まれています。