ビルドのパフォーマンス指標の抽出

問題を報告 ソースを表示

おそらく、すべての Bazel ユーザーのビルドで、想定よりも遅いか、遅いと感じたことがありますか。個々のビルドのパフォーマンスを改善することは、大きな影響を与えるターゲットにとって特に価値があります。以下に例を示します。

  1. 反復と(再)ビルドが頻繁に行われるコア デベロッパー ターゲット。

  2. 共通ライブラリが他のターゲットから大きく依存している。

  3. ターゲットのクラスの代表的なターゲット(カスタムルールなど)を使用して、1 つのビルドで問題を診断して修正することで、大規模な問題の解決に役立つ場合があります。

ビルドのパフォーマンスを改善するための重要なステップは、リソースが消費される場所を把握することです。このページでは、収集できるさまざまな指標について説明します。ビルド パフォーマンスの内訳では、これらの指標を使用してビルド パフォーマンスの問題を検出して修正する方法を紹介しています。

Bazel ビルドから指標を抽出するには、主に次のような方法があります。

Build Event Protocol(BEP)

Bazel は、Build Event Protocol(BEP)を介して、さまざまなプロトコル バッファ build_event_stream.proto を出力します。これは、ユーザーが指定したバックエンドによって集約できます。ユースケースに応じて、さまざまな方法で指標を集計できます。ここでは、一般的に考慮すべきいくつかのコンセプトと proto フィールドについて説明します。

Bazel の query / cquery / aquery コマンド

Bazel には、ユーザーがターゲット グラフ、構成されたターゲット グラフ、アクション グラフをクエリできる 3 種類のクエリモード(querycqueryaquery)が用意されています。クエリ言語には、さまざまなクエリモードで使用できる関数スイートが用意されており、必要に応じてクエリをカスタマイズできます。

JSON トレース プロファイル

ビルドに似た Bazel が呼び出されるたびに、Bazel は JSON 形式でトレース プロファイルを書き込みます。JSON トレース プロファイルは、呼び出し中に Bazel が何にかかった対象をすばやく把握するのに非常に便利です。

実行ログ

実行ログは、マシンと環境の違いや非決定的なアクションに起因するリモート キャッシュ ヒットの欠落のトラブルシューティングと修正に役立ちます。フラグ --experimental_execution_log_spawn_metrics(Bazel 5.2 で利用可能)を渡すと、ローカルで実行されるアクションとリモートで実行されるアクションの両方について、詳細な Spawn 指標も含まれます。これらの指標を使用して、たとえばローカルマシンとリモートマシンのパフォーマンスを比較したり、(キューイングなどが原因で)スポーン実行のどの部分が予想よりも常に遅いかを調べたりできます。

実行グラフのログ

JSON トレース プロファイルにはクリティカル パス情報が含まれていますが、実行されたアクションの依存関係グラフで追加情報が必要になることがあります。Bazel 6.0 以降では、--experimental_execution_graph_log フラグと --experimental_execution_graph_log_dep_type=all フラグを渡して、実行されたアクションとその相互依存関係に関するログを書き出すことができます。

この情報を使用して、クリティカル パス上のノードによって追加されたドラッグを把握できます。ドラッグとは、実行グラフから特定のノードを削除することで節約できる可能性がある時間です。

このデータにより、実際に変更を行う前に、ビルドとアクション グラフに変更を加えた場合の影響を予測できます。

bazel-bench によるベンチマーク

Bazel bench は、次の場合にビルド パフォーマンスのベンチマークを行う Git プロジェクト向けベンチマーク ツールです。

  • プロジェクト ベンチマーク: 1 つの Bazel バージョンで、2 つの Git commit のベンチマークを行います。ビルドの回帰を検出するために使用されます(多くの場合、依存関係の追加により)。

  • Bazel ベンチマーク: 1 回の Git commit で、2 つのバージョンの Bazel を相互にベンチマークします。Bazel 自体内の回帰を検出するために使用されます(Bazel のメンテナンスやフォークを行った場合)。

ベンチマークは、経過時間、CPU 時間、システム時間、Bazel の保持ヒープサイズをモニタリングします。

ばらつきの原因を減らすために、他のプロセスを実行していない専用の物理マシンで Bazel bench を実行することをおすすめします。