このページでは、Bazel を繰り返し実行する際に Bazel のビルド パフォーマンスを最適化する方法について説明します。
Bazel のランタイム状態
Bazel の呼び出しには、相互に作用する複数の部分が含まれます。
bazelコマンドライン インターフェース(CLI)は、ユーザー向けのフロントエンド ツールであり、ユーザーからコマンドを受け取ります。CLI ツールは、個別の 出力ベースごとに Bazel サーバー を起動します。 Bazel サーバーは通常は永続的ですが、リソースを無駄にしないように、アイドル時間が経過するとシャットダウンします。
Bazel サーバーは、指定されたコマンド(
build、run、cqueryなど)の読み込みと分析の手順を実行します。この手順では、ビルドグラフの必要な部分がメモリ内に構築されます。結果のデータ構造は、分析キャッシュの一部として Bazel サーバーに保持されます。Bazel サーバーはアクションの実行も行えます。また、そのように設定されている場合は、アクションをリモート実行に送信することもできます。アクションの実行結果もキャッシュに保存されます。具体的には、アクション キャッシュ(または 実行キャッシュ。ローカルまたはリモートのいずれかであり、Bazel サーバー間で共有される場合があります)に保存されます。
Bazel の呼び出しの結果は、出力ツリーで使用できます。
Bazel を反復的に実行する
一般的なデベロッパーのワークフローでは、コードの一部を繰り返しビルド(または実行)することがよくあります。多くの場合、非常に高い頻度で実行されます(コンパイル エラーの解決や失敗したテストの調査など)。このような状況では、bazel の繰り返し呼び出しのオーバーヘッドが、基盤となる繰り返しアクション(コンパイラの呼び出しやテストの実行など)に対してできるだけ小さくすることが重要です。
これを踏まえて、Bazel のランタイム状態をもう一度見てみましょう。
分析キャッシュは重要なデータです。コールド実行(Bazel サーバーが起動した直後や分析キャッシュが破棄されたときなど)の読み込みと分析のフェーズだけでかなりの時間がかかることがあります。 1 回のコールドビルドが成功した場合(本番環境リリースなど)は、このコストは許容できますが、同じターゲットを繰り返しビルドする場合は、このコストを償却し、呼び出しごとに繰り返さないことが重要です。
分析キャッシュは揮発性です。まず、Bazel サーバーのインプロセス状態の一部であるため、サーバーが失われるとキャッシュも失われます。ただし、キャッシュは非常に簡単に無効になります。たとえば、多くの bazel コマンドライン フラグを指定すると、キャッシュが破棄されます。 これは、多くのフラグがビルド
グラフに影響するためです(
構成可能な属性が原因など)。フラグ
を変更すると、Bazel サーバーが再起動されることもあります(
起動オプションの変更など)。
良好な実行キャッシュは、ビルド パフォーマンスにも役立ちます。実行 キャッシュは、ローカル ディスクまたは リモートに保存できます。キャッシュは、Bazel サーバー間、さらにはデベロッパー間で共有できます。
分析キャッシュを破棄しない
分析キャッシュが破棄された場合、またはサーバーが再起動された場合、Bazel は警告を出力します。反復使用中は、次のいずれも避ける必要があります。
反復ワークフローの途中で
bazelフラグを変更しないように注意してください。たとえば、bazel build -c optとbazel cqueryを混在させると、各コマンドで他方の分析キャッシュが破棄されます。一般に、特定のワークフローの期間中は、固定のフラグセットを使用するようにしてください。Bazel サーバーが失われると、分析キャッシュも失われます。Bazel サーバーには、 構成可能なアイドル 時間があり、その時間が経過するとシャットダウンします。この時間は、ニーズに合わせて bazelrc ファイルで構成できます。起動フラグが変更されるとサーバーも再起動されるため、可能な限りこれらのフラグを変更しないようにしてください。
注意してください。Bazel の実行中に Ctrl+C を繰り返し押すと、Bazel サーバーが強制終了されます。不要になった実行中のビルドを中断して時間を節約しようとするのは当然ですが、Ctrl+C を押すのは 1 回だけにして、現在の呼び出しを正常に終了するようにリクエストしてください。
同じワークスペースで複数のフラグセットを使用する場合は、複数の個別の出力ベースを使用し、
--output_baseフラグで切り替えることができます。各出力ベースには独自の Bazel サーバーが割り当てられます。
この条件を警告ではなくエラーにするには、--noallow_analysis_cache_discard フラグ(Bazel 6.4.0 で導入)を使用します。