Bu sayfada, önbellek isabet oranınızı nasıl kontrol edeceğiniz ve uzaktan yürütme bağlamında önbellek isabetlerini nasıl araştıracağınız açıklanmaktadır.
Bu sayfada, uzaktan yürütmeyi başarıyla kullanan bir derlemeniz ve/veya testiniz olduğu ve uzaktan önbelleği etkili bir şekilde kullandığınızdan emin olmak istediğiniz varsayılmaktadır.
Önbelleğe isabet oranınızı kontrol etme
Bazel çalıştırma işleminizin standart çıktısında, kabaca Bazel işlemlerine karşılık gelen işlemleri listeleyen INFO satırına bakın. Bu satır, işlemin nerede çalıştırıldığını belirtir. Uzaktan yürütülen bir işlemi belirten remote etiketini, yerel korumalı alanda yürütülen işlemler için linux-sandbox etiketini ve diğer yürütme stratejileri için diğer değerleri bulun. Sonucu uzak bir önbellekten gelen bir işlem remote cache hit olarak gösterilir.
Örneğin:
INFO: 11 processes: 6 remote cache hit, 3 internal, 2 remote.
Bu örnekte 6 uzak önbellek isabeti vardır ve 2 işlemde önbellek isabeti yoktur ve uzaktan yürütülmüştür. 3 iç parça yoksayılabilir.
Bu genellikle sembolik bağlantı oluşturma gibi küçük dahili işlemlerdir. Yerel önbellek isabet sayısı bu özete dahil edilmemiştir. 0 işlem (veya beklenenden düşük bir sayı) görüyorsanız bazel clean'yi, ardından derleme/test komutunuzu çalıştırın.
Önbelleğe isabetlerle ilgili sorunları giderme
Beklediğiniz önbellek isabet oranını alamıyorsanız aşağıdakileri yapın:
Aynı derleme/test komutunun yeniden çalıştırıldığında önbelleğe isabet oluşturduğundan emin olun
Önbelleği doldurmasını beklediğiniz derlemeleri ve/veya testleri çalıştırın. Belirli bir yığınta yeni bir derleme ilk kez çalıştırıldığında uzak önbelleğe isabet olmaz. Uzaktan yürütme kapsamında işlem sonuçları önbelleğe depolanır ve sonraki bir çalıştırma işleminde bu sonuçlar alınır.
bazel clean'ü çalıştırın. Bu komut, yerel önbelleğinizi temizler. Böylece, sonuçlar yerel önbellek isabetleri tarafından maskelenmeden uzak önbellek isabetlerini inceleyebilirsiniz.İncelediğiniz derlemeleri ve testleri tekrar çalıştırın (aynı makinede).
Önbellek isabet oranı için
INFOsatırını kontrol edin.remote cache hitveinternaldışında işlem görmüyorsanız önbelleğiniz doğru şekilde dolduruluyor ve ona erişiliyor demektir. Bu durumda, sonraki bölüme geçin.Tutarsızlık olası bir kaynağı, derlemede hermetik olmayan bir şeyin, işlemlerin iki çalıştırma boyunca farklı işlem anahtarları almasına neden olmasıdır. Bu işlemleri bulmak için aşağıdakileri yapın:
a. Yürütme günlüklerini almak için söz konusu derlemeleri veya testleri yeniden çalıştırın:
bazel cleanbazel --optional-flags build //your:target --execution_log_compact_file=/tmp/exec1.logb. İki çalıştırma arasındaki yürütme günlüklerini karşılaştırın. İşlemlerin iki günlük dosyasında da aynı olduğundan emin olun. Tutarsızlıklar, çalıştırmalar arasında gerçekleşen değişiklikler hakkında ipucu verir. Bu tutarsızlıkları ortadan kaldırmak için derlemenizi güncelleyin.
Önbelleğe alma sorunlarını çözebilirseniz ve tekrarlanan çalıştırma artık tüm önbelleğe alma isabetlerini oluşturuyorsa bir sonraki bölüme geçin.
İşlem kimlikleriniz aynıysa ancak önbelleğe alma isabeti yoksa yapılandırmanızda önbelleğe almayı engelleyen bir şey vardır. Sık karşılaşılan sorunları kontrol etmek için bu bölüme devam edin.
Yürütme günlüğündeki tüm işlemlerin
cacheabledeğerinin doğru olarak ayarlandığından emin olun. Bir işlemin yürütme günlüğündecacheablegörünmüyorsa ilgili kuralınBUILDdosyasındaki tanımındano-cacheetiketi olabilir. İşlemin nereden geldiğini belirlemek için yürütme günlüğündekimnemonicvetarget_labelalanlarına bakın.İşlemler aynıysa ve
cacheableise ancak önbelleğe isabet yoksa komut satırınızda--noremote_accept_cachedolabilir. Bu durumda, derleme için önbelleğe aramalar devre dışı bırakılır.Gerçek komut satırını bulmak zorsa Build Event Protocol'daki standart komut satırını aşağıdaki gibi kullanın:
a. Günlüğün metin sürümünü almak için Bazel komutunuza
--build_event_text_file=/tmp/bep.txtekleyin.b. Günlüğün metin sürümünü açın ve
command_line_label: "canonical"ile başlayanstructured_command_linemesajını arayın. Genişletildikten sonra tüm seçenekler listelenir.c.
remote_accept_cacheddeğerini arayın vefalseolarak ayarlanıp ayarlanmadığını kontrol edin.d.
remote_accept_cachedfalseisefalseolarak nerede ayarlandığını belirleyin: komut satırında veya bir bazelrc dosyasında.
Makineler arasında önbelleğe alma işleminin yapıldığından emin olun
Aynı makinede önbelleğe isabetler beklendiği gibi gerçekleştikten sonra aynı derlemeleri/testleri farklı bir makinede çalıştırın. Makinelerde önbelleğe alma işleminin yapılmadığından şüpheleniyorsanız aşağıdakileri yapın:
Mevcut önbellekleri etkilememek için derlemenizde küçük bir değişiklik yapın.
Derlemeyi ilk makinede çalıştırın:
bazel cleanbazel ... build ... --execution_log_compact_file=/tmp/exec1.logDerlemeyi ikinci makinede çalıştırın ve 1. adımdaki değişikliğin dahil edildiğinden emin olun:
bazel cleanbazel ... build ... --execution_log_compact_file=/tmp/exec2.logİki çalıştırmanın yürütme günlüklerini karşılaştırın. Günlükler aynı değilse derleme yapılandırmalarınızı, tutarsızlıklar ve barındırma ortamındaki mülklerin derlemelerden birine sızması açısından inceleyin.
Yürütme günlüklerini karşılaştırma
Yürütme günlüğü, derleme sırasında gerçekleştirilen işlemlerin kayıtlarını içerir. Her kayıt, hem girişleri (yalnızca dosyalar değil, komut satırı bağımsız değişkenleri, ortam değişkenleri vb.) hem de işlemin çıkışlarını açıklar. Bu nedenle, günlüğün incelenmesi bir işlemin neden yeniden yürütüldüğünü ortaya çıkarabilir.
Yürütme günlüğü üç biçimden birinde oluşturulabilir: sıkıştırılmış (--execution_log_compact_file), ikili (--execution_log_binary_file) veya JSON (--execution_log_json_file). Çok az çalışma zamanı yükü olan çok daha küçük dosyalar oluşturduğundan sıkıştırılmış biçim önerilir. Aşağıdaki talimatlar tüm biçimler için geçerlidir. //src/tools/execlog:converter aracını kullanarak da bunları dönüştürebilirsiniz.
Önbelleğe alınan isabetleri beklendiği gibi paylaşmayan iki derlemenin günlüklerini karşılaştırmak için aşağıdakileri yapın:
Her derlemeden yürütme günlüklerini alın ve bunları
/tmp/exec1.logve/tmp/exec2.logolarak saklayın.Bazel kaynak kodunu indirip
//src/tools/execlog:parseraracını derleyin:git clone https://github.com/bazelbuild/bazel.git cd bazel bazel build //src/tools/execlog:parser
Günlükleri kullanıcı tarafından okunabilir bir metin biçimine dönüştürmek için
//src/tools/execlog:parseraracını kullanın. Bu biçimde, ikinci günlükteki işlemler ilk günlükteki sıraya göre sıralanır. Bu sayede karşılaştırma daha kolay olur.bazel-bin/src/tools/execlog/parser \ --log_path=/tmp/exec1.log \ --log_path=/tmp/exec2.log \ --output_path=/tmp/exec1.log.txt \ --output_path=/tmp/exec2.log.txtFarklı metin için
/tmp/exec1.log.txtve/tmp/exec2.log.txt'yi kullanın.