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.