Bu sayfada, önbellek isabet oranınızı nasıl kontrol edeceğiniz ve uzaktan yürütme bağlamında önbellekte bulunmama durumlarını nasıl araştıracağınız açıklanmaktadır.
Bu sayfa, uzaktan yürütmeyi başarılı bir şekilde kullanan bir derleme ve/veya teste sahip olduğunuzu ve uzak önbelleği etkili bir şekilde kullandığınızdan emin olmak istediğinizi varsayar.
Önbellek isabet oranınız kontrol ediliyor
Bazel çalıştırmanızın 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 yapıldığını belirtir. Uzaktan gerçekleştirilen 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 stratejilerine ilişkin diğer değerleri bulun. Sonucu uzak bir önbellekten gelen işlem remote cache hit
olarak görüntülenir.
Örneğin:
INFO: 11 processes: 6 remote cache hit, 3 internal, 2 remote.
Bu örnekte 6 uzak önbellek isabeti vardı ve 2 işlem önbellek isabeti içermiyor ve uzaktan yürütüldü. 3 dahili bölüm yoksayılabilir.
Genellikle, sembolik bağlantılar oluşturmak gibi çok küçük dahili işlemlerdir. Yerel önbellek isabetleri bu özete dahil edilmez. 0 işlem (veya beklenenden daha düşük bir sayı) alıyorsanız bazel clean
komutunu ve ardından derleme/test komutunuzu çalıştırın.
Önbellek isabetleriyle ilgili sorunları giderme
Beklediğiniz önbellek isabeti oranını alamıyorsanız aşağıdakileri yapın:
Aynı derleme/test komutunun yeniden çalıştırılmasının önbellek isabetleri ürettiğinden emin olun
Önbelleği doldurmayı beklediğiniz derlemeleri ve/veya testleri çalıştırın. Yeni bir derleme belirli bir yığında ilk kez çalıştırıldığında, uzaktan önbellek isabetleri bekleyebilirsiniz. Uzaktan yürütmenin bir parçası olarak, işlem sonuçları önbellekte depolanır ve sonraki bir çalıştırma işlemi bunları alır.
bazel clean
komutunu çalıştırın. Bu komut yerel önbelleğinizi temizler. Böylece, sonuçlar yerel önbellek isabetleri tarafından maskelenmeden uzaktan önbellek isabetlerini araştırabilirsiniz.Tekrar araştırdığınız derlemeleri ve testleri aynı makinede çalıştırın.
Önbellek isabet oranı için
INFO
satırını kontrol edin.remote cache hit
veinternal
dışında hiçbir işlem görmüyorsanız önbelleğiniz doğru şekilde dolduruluyor ve erişiliyor demektir. Bu durumda bir sonraki bölüme geçin.Olası tutarsızlık kaynağı, derlemedeki hermetik olmayan bir şeydir. Bu durum, işlemlerin iki çalıştırma genelinde farklı işlem anahtarları almasına neden olur. 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 clean
bazel --optional-flags build //your:target --execution_log_binary_file=/tmp/exec1.log
b. İki çalıştırma arasındaki yürütme günlüklerini karşılaştırın. İşlemlerin iki günlük dosyasında aynı olduğundan emin olun. Tutarsızlıklar, çalıştırmalar arasında gerçekleşen değişiklikler hakkında ipucu sağlar. Bu tutarsızlıkları ortadan kaldırmak için derlemenizi güncelleyin.
Önbelleğe alma sorunlarını çözebiliyorsanız ve şimdi tekrarlanan çalıştırma tüm önbellek isabetlerini oluşturuyorsa bir sonraki bölüme geçin.
İşlem kimlikleriniz aynıysa ancak önbellek isabeti yoksa yapılandırmanızdaki bir şey önbelleğe almayı engelliyordur. Yaygın sorunları kontrol etmek için bu bölüme geçin.
Yürütme günlüğündeki tüm işlemlerde
cacheable
politikasının doğru değerine ayarlandığından emin olun. Bir verme işleminin yürütme günlüğündecacheable
görünmezse ilgili kuralınBUILD
dosyasındaki tanımındano-cache
etiketi olabilir. İşlemin nereden geldiğini belirlemeye yardımcı olması için yürütme günlüğündekimnemonic
vetarget_label
alanlarına bakın.İşlemler aynıysa ve
cacheable
ancak önbellek isabetleri yoksa komut satırınızda--noremote_accept_cached
bulunuyor olabilir. Bu durum, bir derleme için önbellek aramalarını devre dışı bırakacaktır.Gerçek komut satırını anlamak zorsa Etkinlik Derleme Protokolü'ndeki 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.txt
kodunu ekleyin.b. Günlüğün metin sürümünü açın ve
command_line_label: "canonical"
ilestructured_command_line
mesajını arayın. Genişletmeden sonra tüm seçenekler listelenir.c.
remote_accept_cached
için arama yapın vefalse
olarak ayarlanıp ayarlanmadığını kontrol edin.d.
remote_accept_cached
değerifalse
ise neredefalse
olarak ayarlandığını belirleyin: komut satırında veya bir bazelrc dosyasında.
Makineler genelinde önbelleğe almayı sağlayın
Önbellek isabetleri aynı makinede beklendiği gibi gerçekleştikten sonra aynı derlemeleri/testleri farklı bir makinede çalıştırın. Önbelleğe alma işleminin makineler arasında gerçekleşmediğinden şüpheleniyorsanız aşağıdakileri yapın:
Mevcut önbelleklere ulaşmamak için derlemenizde küçük bir değişiklik yapın.
Derlemeyi ilk makinede çalıştırın:
bazel clean
bazel ... build ... --execution_log_binary_file=/tmp/exec1.log
Derlemeyi ikinci makinede çalıştırın ve 1. adımdaki değişikliğin dahil edildiğinden emin olun:
bazel clean
bazel ... build ... --execution_log_binary_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ızda tutarsızlıklar ve derlemelerden birine sızan ana makine ortamındaki özellikleri araştırın.
Yürütme günlüklerini karşılaştırma
Yürütme günlükleri, derleme sırasında gerçekleştirilen tüm işlemlerin kayıtlarını içerir. Her işlem için işlem anahtarındaki tüm bilgileri içeren bir SpawnExec öğesi bulunur. Bu nedenle, günlükler aynıysa işlem önbellek anahtarları da vardır.
Beklendiği gibi önbellek isabetleri 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,
/tmp/exec1.log
ve/tmp/exec2.log
olarak depolayın.Bazel kaynak kodunu indirin ve aşağıdaki komutu kullanarak Bazel klasörüne gidin. Yürütme günlüklerini execlog ayrıştırıcı ile ayrıştırmak için kaynak koduna ihtiyacınız vardır.
git clone https://github.com/bazelbuild/bazel.git cd bazel
Günlükleri metne dönüştürmek için yürütme günlüğü ayrıştırıcıyı kullanın. Aşağıdaki çağrı, karşılaştırma kolaylığı sağlamak için ikinci günlükteki işlemleri de ilk günlükteki işlem sırasına uyacak şekilde sıralar.
bazel build src/tools/execlog:parser 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.txt
/tmp/exec1.log.txt
ile/tmp/exec2.log.txt
değerlerini ayırt etmek için en beğendiğiniz metni kullanın.