メモリを最適化する

このページでは、Bazel が使用するメモリを制限して削減する方法について説明します。

RAM を制限して Bazel を実行する

状況によっては、Bazel で使用するメモリを最小限に抑えたい場合があります。最大ヒープは、起動フラグ --host_jvm_argsを使用して設定できます(例: --host_jvm_args=-Xmx2g)。

メモリと引き換えにインクリメンタル ビルドの速度を上げる

ビルドが大きすぎると、メモリが不足した場合に Bazel が OutOfMemoryError(OOM)をスローすることがあります。次のコマンド フラグ --discard_analysis_cache--nokeep_state_after_build、 および --notrack_incremental_stateを渡すことで、インクリメンタル ビルドの速度が低下する代わりに、Bazel が使用するメモリを減らすことができます。

これらのフラグを使用すると、Bazel がビルドで使用するメモリを最小限に抑えることができますが、 今後のビルドは標準のインクリメンタル ビルドよりも遅くなります。

次のいずれかのフラグを個別に渡すこともできます。

  • --discard_analysis_cache は、実行中( 分析中ではない)に使用されるメモリを削減します。インクリメンタル ビルドでは、パッケージの読み込みをやり直す必要はありませんが、 分析と実行をやり直す必要があります(ただし、ディスク上のアクション キャッシュを使用すると、 ほとんどの再実行を防ぐことができます)。
  • --notrack_incremental_state は、Bazel の内部 依存関係グラフにエッジを保存しないため、インクリメンタル ビルドでは使用できません。次のビルド ではそのデータが破棄されますが、内部デバッグのためにそれまで保持されます 、--nokeep_state_after_build が指定されていない限り。
  • --nokeep_state_after_build は、ビルド後にすべてのデータを破棄するため、 インクリメンタル ビルドは(ディスク上のアクション キャッシュを除き)最初からビルドする必要があります。単独では、現在のビルドのウォーターマークには影響しません。

Skyfocus(試験運用版)を使用して、メモリと引き換えにビルドの柔軟性を高める

Bazel が使用するメモリを減らし、インクリメンタル ビルドの速度を維持したい場合は、 変更するファイルのワーキング セットを Bazel に通知できます。 Bazel は、これらのファイルへの変更を正しくインクリメンタルに再ビルドするために必要な状態のみを保持します。この機能は Skyfocus と呼ばれます。

Skyfocus を使用するには、--experimental_enable_skyfocus フラグを渡します。

bazel build //pkg:target --experimental_enable_skyfocus

デフォルトでは、ワーキング セットはビルド対象のターゲットの横にあるファイルのセットになります 。この例では、//pkg 内のすべてのファイルがワーキング セットに保持され、 ワーキング セット外のファイルへの変更は、 bazel clean を発行するか Bazel サーバーを再起動するまで許可されません。

特定のファイルまたはディレクトリのセットを指定する場合は、次のように --experimental_working_set フラグを使用します。

bazel build //pkg:target --experimental_enable_skyfocus
--experimental_working_set=path/to/another/dir,path/to/tests/dir

--experimental_skyfocus_dump_post_gc_stats を渡して、 メモリ削減量を表示することもできます。

すべてをまとめると、次のようになります。

$ bazel test //pkg:target //tests/... --experimental_enable_skyfocus --experimental_working_set dir1,dir2,dir3/subdir --experimental_skyfocus_dump_post_gc_stats
INFO: --experimental_enable_skyfocus is enabled. Blaze will reclaim memory not needed to build the working set. Run 'blaze dump --skyframe=working_set' to show the working set, after this command.
WARNING: Changes outside of the working set will cause a build error.
INFO: Analyzed 149 targets (4533 packages loaded, 169438 targets configured).
INFO: Found 25 targets and 124 test targets...
INFO: Updated working set successfully.
INFO: Focusing on 334 roots, 3 leafs... (use --experimental_skyfocus_dump_keys to show them)
INFO: Heap: 1237MB -> 676MB (-45.31%)
INFO: Elapsed time: 192.670s ...
INFO: Build completed successfully, 62303 total actions

この例では、Skyfocus を使用することで、Bazel は 561 MB(45%)のメモリを削減できました。 また、dir1dir2dir3/subdir のファイルへの変更を処理するインクリメンタル ビルドは高速な速度を維持できます。ただし、Bazel はこれらのディレクトリ外の変更されたファイルを 再ビルドできません。

メモリ プロファイリング

Bazel には、ルールの メモリ使用量を確認できる組み込みのメモリ プロファイラが用意されています。このプロセスの詳細については、カスタムルールのパフォーマンスを改善する方法に関する ドキュメントのメモリ プロファイリングのセクションをご覧ください。