Derleme performansını ayırma

. Sorun bildirin Kaynağı göster Gece · 7,3 · 7,2 · 7,1 · 7,0 · 6,5

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:

  1. 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çin

    • Bunun nedeni genellikle bağımlılıkların eklenmesi ve bu bağımlılıkların geçişli kapatma.
    • Aşağıdakileri bulmak için query / cquery kullanın riskleri ve bağımlılıkları ortaya çıkarabilirsiniz.
  2. TargetMetrics.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.
  3. 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.

  4. 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).
  5. 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.
  • 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ı)

Sistem yükü ortalamasını içeren profil

Ş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 ve committed-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.

Çalışanların bellek kullanımını içeren profil

Ş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).

Sistem genelinde ağ kullanımını içeren profil

Ş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.