Optimalkan Memori

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) jika tidak memiliki cukup memori. Anda dapat membuat Bazel menggunakan lebih sedikit memori, dengan mengorbankan build inkremental yang lebih lambat, dengan meneruskan tanda 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 membuat build mendatang lebih lambat daripada build inkremental standar.

Anda juga dapat meneruskan salah satu tanda 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 dipertahankan 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 dibangun dari awal (kecuali untuk cache tindakan di disk). Dengan sendirinya, tindakan ini tidak memengaruhi tanda batas atas build saat ini.

Menukar fleksibilitas build untuk memori dengan Skyfocus (Eksperimental)

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

Untuk menggunakan Skyfocus, teruskan tanda --experimental_enable_skyfocus:

bazel build //pkg:target --experimental_enable_skyfocus

Secara default, set kerja akan menjadi set file di samping target yang sedang dibangun. 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 berikut:

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 sesuatu 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 mengurangi penggunaan memori sebesar 561 MB (45%), dan build inkremental untuk menangani perubahan pada file di dir1, dir2, dan dir3/subdir akan mempertahankan kecepatan tinggi, dengan kelemahan bahwa Bazel tidak dapat membangun ulang file yang diubah di luar direktori ini.

Pembuatan Profil Memori

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