反復処理の速度の最適化

問題を報告 ソースを表示 Nightly · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

このページでは、Bazel を繰り返し実行する際に Bazel のビルド パフォーマンスを最適化する方法について説明します。

Bazel のランタイム状態

Bazel の呼び出しには、相互作用する複数の部分が含まれます。

  • bazel コマンドライン インターフェース(CLI)は、ユーザー向けのフロントエンド ツールであり、ユーザーからコマンドを受け取ります。

  • CLI ツールは、個別の出力ベースごとに Bazel サーバーを起動します。Bazel サーバーは通常は永続的ですが、リソースの無駄遣いを避けるため、アイドル状態が続くとシャットダウンします。

  • Bazel サーバーは、指定されたコマンド(buildruncquery など)の読み込みと分析の手順を実行します。この手順では、ビルドグラフの必要な部分をメモリに構築します。結果のデータ構造は、分析キャッシュの一部として Bazel サーバーに保持されます。

  • Bazel サーバーはアクションの実行も行えます。また、そのように設定されている場合は、アクションをリモート実行に送信することもできます。アクション実行の結果もキャッシュに保存されます。具体的には、アクション キャッシュ(または実行キャッシュ。ローカルまたはリモートのいずれかであり、Bazel サーバー間で共有される場合があります)に保存されます。

  • Bazel 呼び出しの結果は、出力ツリーで使用できます。

Bazel を反復的に実行する

一般的なデベロッパーのワークフローでは、コードの一部を繰り返しビルド(または実行)することがよくあります。多くの場合、非常に高い頻度で行われます(コンパイル エラーを解決したり、失敗したテストを調査したりするためなど)。このような状況では、bazel の繰り返し呼び出しのオーバーヘッドが、基盤となる繰り返しアクション(コンパイラの呼び出しやテストの実行など)に対してできるだけ小さくなるようにすることが重要です。

これを踏まえて、Bazel のランタイム状態をもう一度見てみましょう。

分析キャッシュは重要なデータです。コールド実行(Bazel サーバーの起動直後や分析キャッシュが破棄された直後の実行など)の読み込みと分析のフェーズだけでかなりの時間を費やすことがあります。1 回のコールドビルド(本番環境リリースなど)ではこのコストは許容できますが、同じターゲットを繰り返しビルドする場合は、このコストを償却し、呼び出しごとに繰り返さないことが重要です。

分析キャッシュはかなり揮発性です。まず、これは Bazel サーバーのインプロセス状態の一部であるため、サーバーを失うとキャッシュも失われます。ただし、キャッシュは簡単に無効化されます。たとえば、多くの bazel コマンドライン フラグを指定すると、キャッシュが破棄されます。これは、多くのフラグがビルドグラフに影響するためです(構成可能な属性など)。フラグの変更によって Bazel サーバーが再起動されることもあります(起動オプションの変更など)。

適切な実行キャッシュは、ビルド パフォーマンスにも役立ちます。実行キャッシュは、ローカルのディスクまたはリモートに保存できます。キャッシュは Bazel サーバー間、さらにはデベロッパー間で共有できます。

分析キャッシュの破棄を回避する

分析キャッシュが破棄されたか、サーバーが再起動された場合、Bazel は警告を出力します。反復使用中は、次のいずれも避ける必要があります。

  • 反復ワークフローの途中で bazel フラグを変更しないように注意してください。たとえば、bazel build -c optbazel cquery を混在させると、各コマンドは他方の分析キャッシュを破棄します。一般に、特定のワークフローの期間中は、固定のフラグセットを使用するようにしてください。

  • Bazel サーバーが失われると、分析キャッシュも失われます。Bazel サーバーには、構成可能なアイドル時間があり、その時間が経過するとシャットダウンします。この時間は、ニーズに合わせて bazelrc ファイルで構成できます。起動フラグが変更された場合もサーバーが再起動されるため、可能な限りこれらのフラグの変更は避けてください。

  • Bazel の実行中に Ctrl+C キーを繰り返し押すと、Bazel サーバーが強制終了されることに注意してください。不要になった実行中のビルドを中断して時間を節約したくなるかもしれませんが、Ctrl+C を 1 回だけ押して、現在の呼び出しの正常な終了をリクエストしてください。

  • 同じワークスペースから複数のフラグセットを使用する場合は、--output_base フラグで切り替えられる複数の個別の出力ベースを使用できます。各出力ベースには独自の Bazel サーバーが割り当てられます。

この条件を警告ではなくエラーにするには、--noallow_analysis_cache_discard フラグ(Bazel 6.4.0 で導入)を使用します。