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 edebileceğinize ve bunları düzeltmek için neler yapabileceğinize dair 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 / toplarken 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ığından 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 okunup 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 bunların geçişli kapanma grafiğinin 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: Derlemede oluşturulan işlemleri gösterir. Regresyon, işlem grafiğinin oluşturulmasında daha fazla çalışmayı ifade eder. Bu sayıya, yürütülmemiş olabilecek kullanılmayan işlemlerin de dahil olduğunu unutmayın.- Regresyonları ayıklamak için aquery'yi kullanın.
--skyframe_stateile daha fazla ayrıntıya girmeden önce--output=summaryile başlamanızı öneririz.
- Regresyonları 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ı.- Yürütülen 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 ölçütü 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 commit'i arasında gerilerse Starlark CPU profili toplamanızı öneririz. Ayrıca, CPU'nun yoğun olarak kullanıldığı işlerin çoğu analiz aşamasında yapıldığından, derlemeyi analiz aşamasıyla sınırlamak için
--nobuildkullanmanız da önerilir.
- CPU süresi iki proje commit'i arasında gerilerse Starlark CPU profili toplamanızı öneririz. Ayrıca, CPU'nun yoğun olarak kullanıldığı işlerin çoğu analiz aşamasında yapıldığından, derlemeyi analiz aşamasıyla sınırlamak için
Sistem süresi, CPU'nun çekirdekte geçirdiği süredir.
- Sistem saati gerilerse bu durum çoğunlukla Bazel'in dosya sisteminizden dosya okuduğu sırada 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şaretini kullanan JSON izleme profil 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 cinsinden).- Bazel bench bu metrik için de karşılaştırma verileri 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'nin
MemoryMetrics.peak_post_gc_heap_size: GC sonrası bayt cinsinden en yüksek JVM yığın boyutu (tam GC'yi zorlamaya çalışan--memory_profileayarlanmasını gerektirir).
Hafıza kullanımındaki gerileme genellikle derleme isteği boyutu metriklerindeki gerilemenin bir 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 kurallar için yerleşik bellek profil oluşturucuyu 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. Gelecekte bu tür ince ayarların daha az yapılması için Bazel'in kaynak yöneticisini ve planlayıcısını daha akıllı hale getirmek üzere çalışmalarımızı sürdürü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 iletmeniz 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.
İndirme bant genişliğinden tasarruf etmek için yerel bir disk önbelleği de yapılandırabilirsiniz.