Optimalkan Memori

Laporkan masalah Lihat sumber Nightly · 8.0 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

Halaman ini menjelaskan cara membatasi dan mengurangi memori yang digunakan Bazel.

Menjalankan Bazel dengan RAM Terbatas

Dalam situasi tertentu, Anda mungkin ingin Bazel menggunakan memori minimal. Anda dapat menetapkan heap maksimum melalui flag startup --host_jvm_args, seperti --host_jvm_args=-Xmx2g.

Menukar kecepatan build inkremental dengan memori

Jika build Anda terlalu besar, Bazel dapat menampilkan OutOfMemoryError (OOM) saat tidak memiliki cukup memori. Anda dapat membuat Bazel menggunakan lebih sedikit memori, dengan mengorbankan build inkremental yang lebih lambat, dengan meneruskan flag perintah berikut: --discard_analysis_cache, --nokeep_state_after_build, dan --notrack_incremental_state.

Flag ini akan meminimalkan memori yang digunakan Bazel dalam build, dengan mengorbankan build mendatang yang lebih lambat daripada build inkremental standar.

Anda juga dapat meneruskan salah satu flag ini satu per satu:

  • --discard_analysis_cache akan mengurangi memori yang digunakan selama eksekusi (bukan analisis). Build inkremental tidak perlu mengulang pemuatan paket, tetapi harus mengulang analisis dan eksekusi (meskipun cache tindakan di disk dapat mencegah sebagian besar eksekusi ulang).
  • --notrack_incremental_state tidak akan menyimpan tepi apa pun dalam grafik dependensi internal Bazel, sehingga tidak dapat digunakan untuk build inkremental. Build berikutnya akan menghapus data tersebut, tetapi data tersebut akan disimpan hingga saat itu, untuk proses debug internal, kecuali jika --nokeep_state_after_build ditentukan.
  • --nokeep_state_after_build akan menghapus semua data setelah build, sehingga build inkremental harus dibuat dari awal (kecuali untuk cache tindakan di disk). Hal ini tidak memengaruhi nilai maksimum build saat ini.

Menukar fleksibilitas build dengan memori menggunakan Skyfocus (Eksperimental)

Jika ingin membuat Bazel menggunakan lebih sedikit memori dan mempertahankan kecepatan build inkremental, Anda dapat memberi tahu Bazel kumpulan file kerja yang akan diubah, dan Bazel hanya akan menyimpan status yang diperlukan untuk mem-build ulang perubahan secara bertahap dengan benar pada file tersebut. Fitur ini disebut Skyfocus.

Untuk menggunakan Skyfocus, teruskan flag --experimental_enable_skyfocus:

bazel build //pkg:target --experimental_enable_skyfocus

Secara default, set kerja akan menjadi kumpulan file di samping target yang sedang di-build. Dalam contoh, semua file di //pkg akan disimpan dalam set kerja, dan perubahan pada file di luar set kerja tidak akan diizinkan, hingga Anda mengeluarkan bazel clean atau memulai ulang server Bazel.

Jika Anda ingin menentukan kumpulan file atau direktori yang tepat, gunakan flag --experimental_working_set, seperti ini:

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

Anda juga dapat meneruskan --experimental_skyfocus_dump_post_gc_stats untuk menampilkan jumlah pengurangan memori:

Jika digabungkan, Anda akan melihat tampilan seperti ini:

$ 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

Untuk contoh ini, penggunaan Skyfocus memungkinkan Bazel menghapus memori sebesar 561 MB (45%), dan build inkremental untuk menangani perubahan pada file di dir1, dir2, dan dir3/subdir akan mempertahankan kecepatannya yang cepat, dengan konsekuensi bahwa Bazel tidak dapat mem-build ulang file yang diubah di luar direktori ini.

Profiling Memori

Bazel dilengkapi dengan memory profiler bawaan yang dapat membantu Anda memeriksa penggunaan memori aturan. Baca selengkapnya tentang proses ini di bagian Membuat Profil Memori dalam dokumentasi kami tentang cara meningkatkan performa aturan kustom.