メモリを最適化する

問題を報告する ソースを表示 ナイトリー · 8.0 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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

制限付き RAM で Bazel を実行する

状況によっては、Bazel で最小限のメモリを使用する場合があります。最大ヒープは、--host_jvm_args=-Xmx2g などの起動フラグ --host_jvm_args で設定できます。

増分ビルド速度とメモリをトレードオフする

ビルドが大きすぎると、メモリが不足しているときに 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 には、ルールのメモリ使用量を確認できるメモリ プロファイラが組み込まれています。このプロセスについて詳しくは、カスタムルールのパフォーマンスを改善する方法に関するドキュメントのメモリ プロファイリングのセクションをご覧ください。