Bazel karmaşıktır ve bir yapı boyunca birçok farklı işlem yapar. ve bazıları derleme performansını etkileyebilir. Bu sayfa eşlemeye çalışıyor derleme performansı üzerindeki etkilerine değinmek istiyoruz. Bu sırada ancak kapsamlı olmayan, derleme performansının nasıl algılanacağına dair metrikleri ayıklayarak bunları düzeltmek için neler yapabileceğinizi öğrenin. Bu sayede bu kavramları derleme performans regresyonlarını araştırın.
Temiz ve Artımlı derlemeler
Temiz bir derleme, her şeyi sıfırdan oluşturur ve tamamlanmış çalışmaları yeniden kullanan bir araçtır.
Temiz ve artımlı derlemelere ayrı ayrı bakmanızı öneririz. durumlarına bağlı olan metrikleri topluyorsunuz / topluyorsunuz. Bazel'in önbellekleri (örneğin, derleme isteği boyutu metrikleri ) tabi olacaktır. Ayrıca, iki farklı kullanıcı deneyimini temsil ederler. Öncekine kıyasla sıfırdan temiz bir derleme (sıfır önbellek nedeniyle daha uzun sürer), artımlı geliştiriciler kod üzerinde iterasyon yani yineleme gerçekleştirdikçe çok daha sık gerçekleşir (genellikle daha hızlı olmasını sağlayabilirsiniz.
Sınıflandırmak için BEP'deki CumulativeMetrics.num_analyses
alanını kullanabilirsiniz
inşa eder. num_analyses <= 1
ise temiz bir derlemedir; Aksi takdirde
bunu muhtemelen artımlı bir derleme olarak sınıflandırırsınız. Kullanıcı o ana kadar
farklı flag'lere veya farklı hedeflere uyarlayarak etkili şekilde temiz bir derleme elde edersiniz. Herhangi biri
artımlılığın daha katı tanımının şu biçimde uygulanması gerekir:
(ör. yüklenen paket sayısına bakmak yerine)
(PackageMetrics.packages_loaded
).
Derleme performansı için proxy olarak belirleyici derleme metrikleri
Derleme performansını ölçmek, belirleyici olmayan doğası nedeniyle zor olabilir belirli metriklerin (örneğin, Bazel'in CPU süresi veya uzaktan kumandadaki sıra süreleri) kümesi) için geçerlidir. Bu nedenle, aynı zamanda hedeflerinize ulaşmak için belirleyici metriklerden ve Bazel'in yaptığı iş miktarı, bu da Bazel'in performansını etkiler.
Derleme isteğinin boyutu, derleme üzerinde önemli bir etkiye sahip olabilir. bazı yolları da görmüştük. Daha büyük bir yapı, analiz ve üretim için daha fazla oluşturmayı öğreneceksiniz. Derlemelerin organik büyümesi doğal olarak ve dolayısıyla gittikçe karmaşık hale geldiğinden, ortaya çıkan bağımlılıkları ve oluşturulması daha pahalı hale gelir.
Bu problemi çeşitli yapı aşamalarına ayırabilir ve aşağıdaki metrikleri temsil eden şu metrik bulunur:
PackageMetrics.packages_loaded
: Başarıyla yüklenen paketlerin sayısı. Buradaki regresyon, okuma ve ayrıştırma için yapılması gereken daha fazla işi temsil eder yükleme aşamasındaki her ek BUILD dosyası içinTargetMetrics.targets_configured
: hedeflerin sayısını temsil eder ve özellikleri hakkında daha fazla bilgi edinin. Regresyon, proje yönetiminde yapılandırılmış hedef grafiğini oluşturma ve bu grafikler arasında geçiş yapma.- Bu çoğu zaman bağımlılıkların eklenmesi ve geçişli kapanma grafiğini görebilirsiniz.
- Yeni yerleri bulmak için cquery'yi kullanın ve bağımlılıklar eklenmiş olabilir.
ActionSummary.actions_created
: Derlemede oluşturulan işlemleri temsil eder. ve regresyon, eylem grafiğinin oluşturulmasında daha fazla çalışmayı temsil eder. Not Buna, yürütülmemiş olabilecek kullanılmayan işlemler de dahildir.- Regresyonlarda hata ayıklamak için aquery (aquery) ifadesini kullanın.
şununla başlamanızı öneririz:
--output=summary
proje yaşam döngüsü boyunca--skyframe_state
.
- Regresyonlarda hata ayıklamak için aquery (aquery) ifadesini kullanın.
şununla başlamanızı öneririz:
ActionSummary.actions_executed
: gerçekleştirilen işlem sayısı, regresyon doğrudan bu işlemlerin yürütülmesinde daha fazla işin olduğunu gösterir.- BEP, işlem istatistiklerini yazar
En çok yürütülen işlem türlerini gösteren
ActionData
. Varsayılan olarak ilk 20 işlem türünü toplar, ancak her bir--experimental_record_metrics_for_all_mnemonics
uygulayın. - Bu, ne tür işlemlerin gerçekleştirildiğini anlamanıza yardımcı olur. (ayrıca).
- BEP, işlem istatistiklerini yazar
En çok yürütülen işlem türlerini gösteren
BuildGraphSummary.outputArtifactCount
: tarafından oluşturulan yapıların sayısı geri bildirime olanak tanır.- Yürütülen işlemlerin sayısı artmadıysa, bunun nedeni muhtemelen kural uygulaması değiştirildi.
Bu metriklerin tümü yerel önbelleğin durumundan etkilenir; dolayısıyla bu metrikleri çıkardığınız derlemelerin daha iyi performans temiz sürümler oluşturun.
Bu metriklerdeki bir regresyona regresyonlar vardır.
Yerel kaynakların kullanımı
Bazel, yerel makinenizde çeşitli kaynakları (ikisi de analiz (yani yerel işlemleri çalıştırmak) olduğu gibi makinenizin performansını / kullanılabilirliğini temel görevleri öğrendiniz.
Harcanan süre
Belki gürültüye en çok açık olan metrikler (ve derleme işlemine göre büyük farklılıklar gösterebilir.)
anlamına gelir. (Duvar süresi, CPU süresi ve sistem zamanı gibi) Şunları yapabilirsiniz:
bazel-bench ile
bu metrikler için bir karşılaştırma yapar ve yeterli sayıda --runs
olduğunda,
ölçümünüzün istatistiksel
anlamını artırın.
Duvar saati, gerçek dünyada geçen süredir.
- Sadece duvar süresi gerilemesi durumunda, bunun için JSON izleme profili ve önemlidir. Aksi takdirde, potansiyel riskleri azaltmak için duvarı etkilemiş olabilecekleri için diğer regresyon metrikleri araştırın gerekir.
CPU süresi, CPU'nun kullanıcı kodunu yürütmesi için harcanan süredir.
- İki proje kaydetme işleminde CPU süresi geriliyorsa bu işlemi daha sonra tekrar
bir Starlark CPU profili var. Muhtemelen
--nobuild
aracını kullanarak yapıyı analiz aşamasıyla sınırlı tutmak Çok yoğun bir CPU işlemi vardır.
- İki proje kaydetme işleminde CPU süresi geriliyorsa bu işlemi daha sonra tekrar
bir Starlark CPU profili var. Muhtemelen
Sistem süresi, çekirdekte CPU tarafından harcanan süredir.
- Sistem saati gerilemesi durumunda, Bazel şu verileri okuduğunda çoğunlukla G/Ç ile ilişkilidir: dosyalar.
Sistem genelinde yük profili oluşturma
Her bir
--experimental_collect_load_average_in_profiler
Bazel 6.0'da kullanıma sunulan bayrak
JSON izleme profil aracı,
(çağrı sırasındaki sistem yükü ortalaması)
Şekil 1. Sistem yükü ortalamasını içeren profil.
Bazel çağrısı sırasında çok fazla yük olması, Bazel'in planlama yaptığını gösterebilir
makinenize paralel olarak çok fazla yerel işlem vardır. Her iki tarafın da
ilk anlaşmaya uyduğundan
ayarlama
--local_cpu_resources
ve --local_ram_resources
,
özellikle kapsayıcı ortamlarında (en azından
#16512 birleştirilir).
Bazel bellek kullanımını izleme
Bazel'ın bellek kullanımını ölçmek için iki ana kaynak vardır: Bazel info
ve
BEP.
bazel info used-heap-size-after-gc
: Doğrulama işleminden sonra bayt cinsinden kullanılan bellek miktarıSystem.gc()
aranıyor.- Bazel bankı bu metrik için karşılaştırmalar da sağlar.
- Ayrıca
peak-heap-size
,max-heap-size
,used-heap-size
var vecommitted-heap-size
(bkz. dokümanlar) içerir ancak daha az alakalı olur.
BEP
MemoryMetrics.peak_post_gc_heap_size
: En yüksek JVM yığın boyutunun boyutu GC sonrası bayt (ayar gerektirir)--memory_profile
tam GC'yi zorlamaya teşebbüs eder).
Bellek kullanımında regresyon, genellikle istek boyutu metrikleri oluşturun ve çoğu zaman bağımlılıkların eklenmesi ya da kuraldaki bir değişikliğin hakkında bilgi edindiniz.
Bazel'in bellek ayak izini daha ayrıntılı bir şekilde analiz etmek için yerleşik bellek profil aracı kontrol edin.
Kalıcı çalışanların bellek profilini çıkarma
Kalıcı çalışanlar derlemeleri hızlandırmaya yardımcı olabilir
(özellikle yorumlanan dillerde) bellek ayak izi
neden olur. Bazel, çalışanlarından, özellikle de
WorkerMetrics.WorkerStats.worker_memory_in_kb
alanı, bellek miktarını gösterir
kullandığı (hatırlatıcılara göre)
JSON iz profili aracı da
çağırma sırasında
--experimental_collect_system_network_usage
flag'i (Bazel 6.0'da yeni olan) içerir.
Şekil 2. Çalışanların bellek kullanımını içeren profil.
Örneğin,
--worker_max_instances
(varsayılan 4) azaltarak
kalıcı çalışanlar tarafından kullanılan bellek miktarıdır. YouTube'da aktif olarak
Böylece Bazel’in kaynak yöneticisi ve planlayıcısı daha akıllı hale geliyor. Böylece bu tür hassas
gerekli olacaktır.
Uzaktan derlemeler için ağ trafiğini izleme
Uzaktan yürütme işleminde Bazel, üzerine konuşacağız. Bu nedenle, ağınızın bant genişliği, performansı etkileyebilir. birçok yolu vardır.
Derlemeleriniz için uzaktan yürütme özelliğini kullanıyorsanız şunları yapabilirsiniz:
şunu kullanarak çağrı sırasında ağ trafiğini izleme:
BEP'den NetworkMetrics.SystemNetworkStats
protokolü
(--experimental_collect_system_network_usage
öğesinin iletilmesini gerektirir).
Ayrıca, JSON izleme profilleri
derleme işlemi boyunca sistem genelindeki ağ kullanımını görüntülemenize olanak tanır.
--experimental_collect_system_network_usage
bayrağını geçirerek (Bazel'de yeni)
6.0).
Şekil 3. Sistem genelinde ağ kullanımını içeren profil.
Uzaktan yürütme kullanılırken yüksek fakat sabit ağ kullanımı,
bu ağ, derlemenizdeki performans sorunudur. kullanmıyorsanız
--remote_download_minimal
.
Bu işlem, gereksiz ara yapıların indirilmesini önleyerek derlemelerinizi hızlandırır.
Diğer bir seçenek de disk önbelleği ile tasarruf edin indirme bant genişliğine sahip.