Bu sayfada, Bazel'in kullandığı belleğin nasıl sınırlanacağı ve azaltılacağı açıklanmaktadır.
Sınırlı RAM ile Bazel çalıştırma
Bazı durumlarda Bazel'in minimum bellek kullanmasını isteyebilirsiniz. Maksimum yığın boyutunu --host_jvm_args=-Xmx2g
gibi bir başlangıç işareti --host_jvm_args
aracılığıyla ayarlayabilirsiniz.
Artımlı derleme hızlarını bellekle takas etme
Derlemeleriniz çok büyükse Bazel yeterli belleğe sahip olmadığında OutOfMemoryError
(OOM) hatası verebilir. Aşağıdaki komut işaretlerini ileterek Bazel'in daha az bellek kullanmasını sağlayabilirsiniz. Bu durumda artımlı derlemeler daha yavaş olur:
--discard_analysis_cache
,
--nokeep_state_after_build
ve
--notrack_incremental_state
.
Bu işaretler, Bazel'in bir derlemede kullandığı belleği en aza indirir. Bunun karşılığında, sonraki derlemeler standart artımlı derlemelerden daha yavaş olur.
Bu işaretlerden herhangi birini tek tek de iletebilirsiniz:
--discard_analysis_cache
, yürütme sırasında kullanılan belleği (analiz sırasında değil) azaltır. Artımlı derlemelerde paket yükleme işleminin yeniden yapılması gerekmez ancak analiz ve yürütme işleminin yeniden yapılması gerekir (diskteki işlem önbelleği çoğu yeniden yürütme işlemini önleyebilir).--notrack_incremental_state
, Bazel'in dahili bağımlılık grafiğinde herhangi bir kenar depolamaz. Bu nedenle, artımlı derlemeler için kullanılamaz. Sonraki derleme bu verileri atar ancak--nokeep_state_after_build
belirtilmediği sürece dahili hata ayıklama için o zamana kadar korunur.--nokeep_state_after_build
, derlemeden sonra tüm verileri atar. Bu nedenle, artımlı derlemelerin sıfırdan derlenmesi gerekir (disk üzerindeki işlem önbelleği hariç). Bu durum, mevcut derlemenin en yüksek noktasını tek başına etkilemez.
Skyfocus ile bellek için derleme esnekliğini takas edin (Deneysel)
Bazel'in daha az bellek kullanmasını ve artımlı derleme hızlarını korumasını istiyorsanız Bazel'e değiştireceğiniz çalışma dosyası grubunu belirtebilirsiniz. Bazel, yalnızca bu dosyalardaki değişiklikleri doğru şekilde artımlı olarak yeniden oluşturmak için gereken durumu saklar. Bu özelliğe Skyfocus adı verilir.
Skyfocus'u kullanmak için --experimental_enable_skyfocus
işaretini iletin:
bazel build //pkg:target --experimental_enable_skyfocus
Varsayılan olarak çalışma grubu, derlenen hedefin yanındaki dosya grubu olur. Örnekte, //pkg
içindeki tüm dosyalar çalışma grubunda tutulur ve bazel clean
komutunu verene veya Bazel sunucusunu yeniden başlatana kadar çalışma grubunun dışındaki dosyalarda değişiklik yapılmasına izin verilmez.
Tam bir dosya veya dizin grubu belirtmek istiyorsanız --experimental_working_set
işaretini kullanın. Örneğin:
bazel build //pkg:target --experimental_enable_skyfocus
--experimental_working_set=path/to/another/dir,path/to/tests/dir
Bellek azaltma miktarını göstermek için --experimental_skyfocus_dump_post_gc_stats
değerini de iletebilirsiniz:
Tüm bunları bir araya getirdiğimizde aşağıdaki gibi bir görünüm elde ederiz:
$ 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
Bu örnekte, Skyfocus'un kullanılması Bazel'in 561 MB (%45) bellek bırakmasına olanak tanıdı. dir1
, dir2
ve dir3/subdir
altındaki dosyalarda yapılan değişiklikleri ele alan artımlı derlemeler, Bazel'in değiştirilen dosyaları bu dizinlerin dışında yeniden derleyememesi karşılığında hızlı hızlarını koruyacak.
Bellek Kullanımı Profilleme
Bazel, kuralınızın bellek kullanımını kontrol etmenize yardımcı olabilecek yerleşik bir bellek profilleyici içerir. Özel kuralların performansını artırmayla ilgili dokümanlarımızın Bellek Profilleme bölümünde bu işlem hakkında daha fazla bilgi edinebilirsiniz.