Bazel karmaşıktır ve derleme sırasında birçok farklı işlem yapar. Bu işlemlerden bazıları derleme performansını etkileyebilir. Bu sayfada, Bazel ile ilgili bazı kavramların derleme performansı üzerindeki etkileri açıklanmaya çalışılmaktadır. Kapsamlı olmasa da metrikleri ayıklayarak derleme performansıyla ilgili sorunları nasıl tespit edeceğiniz ve bunları düzeltmek için neler yapabileceğinizle ilgili bazı örnekler ekledik. Bu bilgilerle, derleme performansındaki gerilemeleri incelerken bu kavramları uygulayabileceğinizi umuyoruz.
Temiz ve artımlı derlemeler
Temiz derleme, her şeyi sıfırdan derlerken artımlı derleme, tamamlanmış bazı çalışmaları yeniden kullanır.
Özellikle Bazel'in önbelleklerinin durumuna bağlı metrikler (ör. derleme isteği boyutu metrikleri) toplarken / birleştirirken temiz ve artımlı derlemelere ayrı ayrı bakmanızı öneririz. Ayrıca, iki farklı kullanıcı deneyimini temsil ederler. Sıfırdan temiz bir derleme başlatmaya kıyasla (soğuk önbellek nedeniyle daha uzun sürer) geliştiriciler kod üzerinde yineleme yaptığında artımlı derlemeler çok daha sık gerçekleşir (önbellek genellikle zaten sıcak olduğundan daha hızlıdır).
Derlemeleri sınıflandırmak için BEP'deki CumulativeMetrics.num_analyses alanını kullanabilirsiniz. num_analyses <= 1 ise temiz bir derlemedir. Aksi takdirde, bunu genel olarak artımlı bir derleme olarak sınıflandırabiliriz. Kullanıcı, farklı işaretlere veya farklı hedeflere geçmiş olabilir ve bu da etkili bir şekilde temiz derlemeye neden olur. Artışın daha katı bir tanımı, büyük olasılıkla bir sezgisel yöntem şeklinde olacaktır. Örneğin, yüklenen paketlerin sayısına (PackageMetrics.packages_loaded) bakılabilir.
Derleme performansının yerine derleme metriklerini kullanma
Belirli metriklerin (ör. Bazel'in CPU süresi veya uzak kümedeki kuyruk süreleri) deterministik olmayan yapısı nedeniyle derleme performansını ölçmek zor olabilir. Bu nedenle, Bazel'in yaptığı işin miktarını (bu da performansını etkiler) tahmin etmek için deterministik metrikleri kullanmak faydalı olabilir.
Derleme isteğinin boyutu, derleme performansını önemli ölçüde etkileyebilir. Daha büyük bir derleme, derleme grafiklerinin analiz edilmesi ve oluşturulması için daha fazla çalışma gerektirebilir. Daha fazla bağımlılık eklenip oluşturulduğundan derlemelerin organik büyümesi geliştirme sürecinde doğal olarak gerçekleşir. Bu nedenle, derlemelerin karmaşıklığı artar ve oluşturulması daha maliyetli hale gelir.
Bu sorunu çeşitli derleme aşamalarına ayırabilir ve her aşamada yapılan iş için aşağıdaki metrikleri vekil metrik olarak kullanabiliriz:
PackageMetrics.packages_loaded: Başarıyla yüklenen paket sayısı. Buradaki bir gerileme, yükleme aşamasında her ek BUILD dosyasının okunması ve ayrıştırılması için daha fazla çalışma yapılması gerektiğini gösterir.TargetMetrics.targets_configured: Derlemede yapılandırılan hedef ve yön sayısını gösterir. Regresyon, yapılandırılmış hedef grafiğin oluşturulması ve geçilmesi için daha fazla çalışma gerektirir.- Bu durum genellikle bağımlılıkların eklenmesinden ve geçişli kapanış grafiklerinin oluşturulmasından kaynaklanır.
- Yeni bağımlılıkların nereye eklenmiş olabileceğini bulmak için cquery'yi kullanın.
ActionSummary.actions_created: Oluşturma adımında oluşturulan işlemleri gösterir. Gerileme ise işlem grafiğinin oluşturulmasında daha fazla çalışma yapılması gerektiğini gösterir. Buna, yürütülmemiş olabilecek kullanılmayan işlemlerin de dahil olduğunu unutmayın.- Regresyonlarda hata ayıklamak için aquery'yi kullanın.
--skyframe_stateile daha ayrıntılı incelemeye başlamadan önce--output=summaryile başlamanızı öneririz.
- Regresyonlarda hata ayıklamak için aquery'yi kullanın.
ActionSummary.actions_executed: Gerçekleştirilen işlem sayısı. Bir gerileme, bu işlemlerin yürütülmesinde doğrudan daha fazla iş yapılması anlamına gelir.- BEP, en çok gerçekleştirilen işlem türlerini gösteren işlem istatistiklerini
ActionDatayazar. Varsayılan olarak, en çok kullanılan 20 işlem türü toplanır. Ancak, yürütülen tüm işlem türleri için bu verileri toplamak üzere--experimental_record_metrics_for_all_mnemonicsdeğerini iletebilirsiniz. - Bu, hangi tür işlemlerin (ek olarak) yürütüldüğünü anlamanıza yardımcı olur.
- BEP, en çok gerçekleştirilen işlem türlerini gösteren işlem istatistiklerini
BuildGraphSummary.outputArtifactCount: Yürütülen işlemler tarafından oluşturulan yapay nesnelerin sayısı.- Gerçekleştirilen işlem sayısı artmadıysa kural uygulaması değiştirilmiş olabilir.
Bu metriklerin tümü yerel önbelleğin durumundan etkilenir. Bu nedenle, bu metrikleri çıkardığınız derlemelerin temiz derlemeler olduğundan emin olmanız gerekir.
Bu metriklerden herhangi birinde gerileme olması durumunda geçen süre, CPU süresi ve bellek kullanımında da gerileme olabileceğini belirtmek isteriz.
Yerel kaynakların kullanımı
Bazel, yerel makinenizde çeşitli kaynaklar kullanır (hem derleme grafiğini analiz etmek ve yürütmeyi yönlendirmek hem de yerel işlemleri çalıştırmak için). Bu durum, makinenizin derleme işlemini ve diğer görevleri gerçekleştirme performansını / kullanılabilirliğini etkileyebilir.
Harcanan süre
Gürültüden en çok etkilenen ve derlemeden derlemeye büyük ölçüde değişebilen metrikler zamandır. Özellikle de gerçek zaman, CPU zamanı ve sistem zamanı. Bu metrikler için bir karşılaştırma elde etmek üzere bazel-bench'i kullanabilirsiniz. Yeterli sayıda --runs ile ölçümünüzün istatistiksel anlamlılığını artırabilirsiniz.
Toplam süre, geçen gerçek dünya süresidir.
- Yalnızca duvar saati geriliyorsa JSON izleme profili toplamanızı ve farklılıkları aramanızı öneririz. Aksi takdirde, duvar süresini etkilemiş olabilecek diğer gerileyen metrikleri incelemek daha verimli olabilir.
CPU süresi, CPU'nun kullanıcı kodunu yürütmek için harcadığı süredir.
- CPU süresi iki proje taahhüdü arasında gerilerse Starlark CPU profili toplamanızı öneririz. CPU'nun yoğun olarak kullanıldığı yer analiz aşaması olduğundan, derlemeyi bu aşamayla kısıtlamak için
--nobuildkullanmanız da muhtemeldir.
- CPU süresi iki proje taahhüdü arasında gerilerse Starlark CPU profili toplamanızı öneririz. CPU'nun yoğun olarak kullanıldığı yer analiz aşaması olduğundan, derlemeyi bu aşamayla kısıtlamak için
Sistem süresi, CPU'nun çekirdekte geçirdiği süredir.
- Sistem saati gerilerse bu durum çoğunlukla Bazel, dosya sisteminizden dosya okuduğunda G/Ç ile ilişkilidir.
Sistem genelinde yük profili oluşturma
Bazel 6.0'da kullanıma sunulan --experimental_collect_load_average_in_profiler işareti kullanıldığında, JSON izleme profili oluşturucu, çağırma sırasında sistem yükü ortalamasını toplar.

Şekil 1. Sistem yükü ortalamasını içeren profil.
Bir Bazel çağrısı sırasında yüksek yük, Bazel'in makineniz için çok fazla yerel işlemi paralel olarak planladığını gösterebilir. Özellikle kapsayıcı ortamlarda (en azından #16512 birleştirilene kadar) --local_cpu_resources ve --local_ram_resources değerlerini ayarlamayı düşünebilirsiniz.
Bazel bellek kullanımını izleme
Bazel'in bellek kullanımını öğrenmek için iki ana kaynak vardır: Bazel info ve BEP.
bazel info used-heap-size-after-gc:System.gc()çağrısından sonra kullanılan bellek miktarı (bayt).- Bazel bench, bu metrik için de karşılaştırma sağlar.
- Ayrıca
peak-heap-size,max-heap-size,used-heap-sizevecommitted-heap-size(belgelere bakın) vardır ancak bunlar daha az alakalıdır.
BEP'ler
MemoryMetrics.peak_post_gc_heap_size: GC sonrası bayt cinsinden en yüksek JVM yığın boyutu (--memory_profiletam GC'yi zorlamaya çalışan ayarın yapılması gerekir).
Bellek kullanımındaki gerileme genellikle derleme isteği boyutu metriklerindeki gerilemenin sonucudur. Bu durum genellikle bağımlılıkların eklenmesinden veya kural uygulamasındaki bir değişiklikten kaynaklanır.
Bazel'in bellekte kapladığı yeri daha ayrıntılı bir düzeyde analiz etmek için kurallarda yerleşik bellek profiler'ını kullanmanızı öneririz.
Kalıcı çalışanların bellek kullanımının profilini çıkarma
Kalıcı çalışanlar, derlemelerin önemli ölçüde hızlanmasına yardımcı olsa da (özellikle yorumlanan diller için) bellek ayak izleri sorunlu olabilir. Bazel, çalışanlarıyla ilgili metrikler toplar. Özellikle WorkerMetrics.WorkerStats.worker_memory_in_kb alanı, çalışanların ne kadar bellek kullandığını (anımsatıcıya göre) gösterir.
JSON izleme
profil oluşturucu, --experimental_collect_system_network_usage
işaretini (Bazel 6.0'da yeni) ileterek çağırma sırasında kalıcı çalışan bellek kullanımını da toplar.

Şekil 2. Çalışanların bellek kullanımını içeren profil.
--worker_max_instances değerini düşürmek (varsayılan değer 4), kalıcı çalışanlar tarafından kullanılan bellek miktarını azaltmaya yardımcı olabilir. Bu tür ince ayarların gelecekte daha az sıklıkta yapılması için Bazel'in kaynak yöneticisini ve planlayıcısını daha akıllı hale getirmek üzere aktif olarak çalışıyoruz.
Uzak derlemeler için ağ trafiğini izleme
Uzaktan yürütmede Bazel, işlemleri yürütmenin sonucu olarak oluşturulan yapıları indirir. Bu nedenle, ağınızın bant genişliği derlemenizin performansını etkileyebilir.
Derlemeleriniz için uzaktan yürütme kullanıyorsanız BEP'den NetworkMetrics.SystemNetworkStats proto'yu kullanarak çağırma sırasında ağ trafiğini izlemeyi düşünebilirsiniz (--experimental_collect_system_network_usage iletmek gerekir).
Ayrıca, JSON izleme profilleri, --experimental_collect_system_network_usage işaretini (Bazel 6.0'da yeni) ileterek derleme boyunca sistem genelinde ağ kullanımını görüntülemenize olanak tanır.

Şekil 3. Sistem genelinde ağ kullanımını içeren profil.
Uzak yürütme kullanılırken yüksek ancak nispeten düz bir ağ kullanımı, derlemenizde ağın darboğaz olduğunu gösterebilir. Henüz kullanmıyorsanız --remote_download_minimal ileterek baytlar olmadan derleme özelliğini etkinleştirmeyi düşünebilirsiniz.
Bu, gereksiz ara yapıtların indirilmesini önleyerek derlemelerinizi hızlandırır.
Diğer bir seçenek de indirme bant genişliğinden tasarruf etmek için yerel bir disk önbelleği yapılandırmaktır.