おそらく、すべての Bazel ユーザーが、想定よりも遅い、または非常に遅いビルドを経験したことがあるでしょう。個々のビルドのパフォーマンスを改善することは、次のような大きな影響を与えるターゲットに対して特に価値があります。
頻繁に反復処理と(再)ビルドが行われる中核的なデベロッパー ターゲット。
他のターゲットから広く依存している共通ライブラリ。
ターゲットのクラス(カスタムルールなど)の代表的なターゲット。1 つのビルドで問題を診断して修正すると、大規模な問題を解決できます。
ビルドのパフォーマンスを向上させるための重要なステップは、ビルドのパフォーマンスを向上させるための重要なステップです。 費用を節約できますこのページでは、収集できるさまざまな指標について説明します。 ビルド パフォーマンスの内訳の紹介 これらの指標を使用してビルド パフォーマンスの問題を検出して修正する方法を確認しましょう。
Bazel ビルドから指標を抽出する主な方法は次のとおりです。
Build Event Protocol(BEP)
Bazel はさまざまなプロトコル バッファを出力します。
build_event_stream.proto
Build Event Protocol(BEP)を
指定したバックエンドで集計できます。ユースケースに応じて、指標をさまざまな方法で集計できますが、ここでは、一般に検討する価値のあるコンセプトとプロトフィールドについて説明します。
Bazel の query / cquery / aquery コマンド
Bazel には、3 種類のクエリモード(query、 cquery や aquery など)を使用して、 ターゲット グラフ、構成済みのターゲット グラフ、アクション グラフをクエリする できます。クエリ言語には、 さまざまな機能のスイートの クエリモードを使用すると、ニーズに合わせてクエリをカスタマイズできます。
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 ベンチは ベンチマーク ツールを使用して、Git プロジェクト内でのビルド パフォーマンスを 次のようなケースがあります。
プロジェクトのベンチマーク: 単一の Bazel バージョンで 2 つの Git コミットをベンチマークします。ビルドの回帰を検出するために使用されます(多くの場合、依存関係の追加によって)。
Bazel ベンチマーク: 1 つの git コミットで 2 つのバージョンの Bazel をベンチマークします。Bazel 自体内の回帰の検出に使用されます( Bazel のメンテナンスやフォークなど)。
ベンチマークは、経過時間、CPU 時間、システム時間、Bazel の保持ヒープサイズをモニタリングします。
Bazel ベンチは、次の要件を満たす専用の物理マシンで実行することも ばらつきの要因を減らすため、他のプロセスを実行していません。