Bazel ユーザーは、ビルドが遅い、または想定よりも遅いという経験をしたことがあるでしょう。個々のビルドのパフォーマンスを改善することは、次のような大きな影響を与えるターゲットにとって特に価値があります。
頻繁に反復処理され、(再)構築されるコア デベロッパー ターゲット。
他のターゲットから広く依存されている共通ライブラリ。
ターゲットのクラス(カスタムルールなど)から代表的なターゲットを選択し、1 つのビルドで問題を診断して修正すると、より大規模な問題の解決に役立つことがあります。
ビルドのパフォーマンスを改善する重要なステップは、リソースがどこで使用されているかを把握することです。このページでは、収集できるさまざまな指標について説明します。ビルド パフォーマンスの内訳では、これらの指標を使用してビルド パフォーマンスの問題を検出して修正する方法を紹介しています。
Bazel ビルドから指標を抽出する主な方法は次のとおりです。
Build Event Protocol(BEP)
Bazel は、Build Event Protocol(BEP)を介してさまざまなプロトコル バッファ build_event_stream.proto
を出力します。これは、ユーザーが指定したバックエンドで集約できます。ユースケースに応じて、さまざまな方法で指標を集計できますが、ここでは、一般的に考慮すると便利なコンセプトと proto フィールドについて説明します。
Bazel の query / cquery / aquery コマンド
Bazel には、ターゲット グラフ、構成されたターゲット グラフ、アクション グラフをそれぞれクエリできる 3 つの異なるクエリモード(query、cquery、aquery)が用意されています。クエリ言語には、さまざまなクエリモードで使用できる一連の関数が用意されています。これにより、必要に応じてクエリをカスタマイズできます。
JSON トレース プロファイル
ビルドのような Bazel 呼び出しごとに、Bazel は JSON 形式のトレース プロファイルを書き込みます。JSON トレース プロファイルは、呼び出し中に Bazel が何に時間を費やしたかをすばやく把握するのに非常に役立ちます。
実行ログ
実行ログは、マシンと環境の違いや非決定論的アクションが原因でリモート キャッシュ ヒットが欠落している場合のトラブルシューティングと修正に役立ちます。フラグ --experimental_execution_log_spawn_metrics
(Bazel 5.2 以降で使用可能)を渡すと、ローカルとリモートの両方で実行されたアクションの詳細なスポーン指標も含まれます。これらの指標を使用すると、ローカル マシンとリモート マシンのパフォーマンスを比較したり、生成実行のどの部分が予想よりも遅いか(キューイングなど)を特定したりできます。
実行グラフのログ
JSON トレース プロファイルにはクリティカル パスの情報が含まれていますが、実行されたアクションの依存関係グラフに関する追加情報が必要になることがあります。Bazel 6.0 以降では、--experimental_execution_graph_log
フラグと --experimental_execution_graph_log_dep_type=all
フラグを渡して、実行されたアクションとその相互依存関係に関するログを書き出すことができます。
この情報を使用して、クリティカル パス上のノードによって追加される遅延を把握できます。ドラッグは、実行グラフから特定のノードを削除することで節約できる可能性のある時間です。
このデータを使用すると、ビルドグラフとアクション グラフの変更を実際に行う前に、その影響を予測できます。
bazel-bench を使用したベンチマーク
Bazel bench は、Git プロジェクトのベンチマーク ツールです。次のケースでビルド パフォーマンスをベンチマークします。
プロジェクトのベンチマーク: 単一の Bazel バージョンで 2 つの git コミットを相互にベンチマークします。ビルドの回帰を検出するために使用されます(多くの場合、依存関係の追加を通じて)。
Bazel ベンチマーク: 単一の git コミットで 2 つのバージョンの Bazel を相互にベンチマークします。Bazel 自体の回帰を検出するために使用されます(Bazel をメンテナンスまたはフォークしている場合)。
ベンチマークは、実経過時間、CPU 時間、システム時間、Bazel の保持ヒープサイズをモニタリングします。
変動要因を減らすため、他のプロセスを実行していない専用の物理マシンで Bazel ベンチマークを実行することもおすすめします。