このページでは、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 のメモリ使用量を減らすことができます。
これらのフラグを使用すると、ビルドで使用されるメモリが最小限に抑えられますが、今後のビルドが標準の増分ビルドよりも遅くなります。
これらのフラグは個別に渡すこともできます。
--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%)のメモリを削減し、dir1
、dir2
、dir3/subdir
の下のファイルに対する変更を処理する増分ビルドは高速を維持できます。ただし、Bazel はこれらのディレクトリ外の変更されたファイルを再ビルドできません。
メモリ プロファイリング
Bazel には、ルールのメモリ使用量を確認するのに役立つメモリ プロファイラが組み込まれています。このプロセスの詳細については、カスタムルールのパフォーマンスを改善する方法に関するドキュメントのメモリ プロファイリングのセクションをご覧ください。