Optimalkan Memori

Laporkan masalah Lihat sumber Per malam · 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 menyetel heap maksimum melalui flag startup --host_jvm_args, seperti --host_jvm_args=-Xmx2g.

Bertukar kecepatan build inkremental untuk memori

Jika build terlalu besar, Bazel dapat menampilkan OutOfMemoryError (OOM) saat tidak memiliki cukup memori. Anda dapat membuat Bazel menggunakan lebih sedikit memori, dengan biaya 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 membuat build mendatang lebih lambat dari build inkremental standar.

Anda juga dapat meneruskan salah satu tanda ini secara terpisah:

  • --discard_analysis_cache akan mengurangi memori yang digunakan selama eksekusi (bukan analisis data). Build inkremental tidak harus mengulangi pemuatan paket, tetapi harus mengulangi analisis dan eksekusi (meskipun {i>cache<i} tindakan pada {i>on-disk<i} dapat mencegah sebagian besar eksekusi ulang).
  • --notrack_incremental_state tidak akan menyimpan tepi apa pun di bagian internal Bazel grafik dependensi, sehingga tidak dapat digunakan untuk build inkremental. Build berikutnya akan membuang data tersebut, namun data itu dipertahankan sampai saat itu, untuk {i>debugging<i} 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). Sendiri, hal ini tidak memengaruhi level air tinggi dari build saat ini.

Tukar 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 mengenai {i>workdataset<i} yang akan Anda modifikasi, dan Bazel hanya akan mempertahankan status yang diperlukan untuk membangun kembali perubahan secara file tersebut. Fitur ini disebut Skyfocus.

Untuk menggunakan Skyfocus, teruskan flag --experimental_enable_skyfocus:

bazel build //pkg:target --experimental_enable_skyfocus

Secara {i>default<i}, {i>working set<i} akan menjadi kumpulan file di sebelah target yang dibuat. 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 metode --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:

Dengan menggabungkan semuanya, 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 untuk mengurangi 561MB (45%) memori, dan build inkremental untuk menangani perubahan pada file di bawah dir1, dir2, dan dir3/subdir akan mempertahankan kecepatannya yang cepat, tetapi Bazel tidak bisa membangun ulang file yang diubah di luar direktori ini.

Profiling Memori

Bazel dilengkapi dengan profiler memori bawaan yang dapat membantu Anda memeriksa penggunaan memori. Baca selengkapnya tentang proses ini di Bagian Memory Profiling dalam dokumentasi tentang cara meningkatkan performa aturan kustom.