メモリを最適化する

問題を報告する <ph type="x-smartling-placeholder"></ph> ソースを表示 夜間 · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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

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

状況によっては、Bazel によるメモリの使用を最小限にしたいことがあります。1 対 1 の 起動フラグによる最大ヒープ --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%)削減できました。 および増分ビルドを使用して、dir1dir2、および dir3/subdir は高速速度を維持しますが、Bazel ではできないというトレードオフがあります これらのディレクトリの外で変更されたファイルを再ビルドします。

メモリ プロファイリング

Bazel には Memory Profiler が組み込まれており、ルールのチェックに役立つ メモリ使用率が高くなりますこのプロセスについて詳しくは、カスタムルールのパフォーマンスを改善する方法に関するドキュメントのメモリ プロファイリングのセクションをご覧ください。