Bu sayfada önbellek isabet oranınızı nasıl kontrol edeceğiniz ve önbellekteki eksiklikleri uzaktan yürütme bağlamında nasıl araştıracağınız açıklanmaktadır.
Bu sayfada, uzaktan yürütmeyi başarılı bir şekilde kullanan bir derleme ve/veya teste sahip olduğunuz ve uzak ö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ırmanızın standart çıkışında, kabaca Bazel işlemlerine karşılık gelen işlemleri listeleyen INFO
satırına bakın. Bu satırda, eylemin
nerede gerçekleştirildiği Bir işlemin uzaktan yürütüldüğünü belirten remote
etiketini, yerel korumalı alanda yürütülen işlemler için linux-sandbox
değerini 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 önbelleğe isabet vardır ve 2 işlemde önbelleğe isabet yoktur ve uzaktan yürütülmüştür. 3 dahili bölüm yoksayılabilir.
Genellikle, sembolik bağlantılar oluşturma gibi çok küçük dahili işlemlerdir. Yerel önbellek isabetleri bu özete dahil edilmez. 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 komutunu yeniden çalıştırmanın önbellek isabetleri ürettiğinden 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ütmenin bir parçası olarak işlem sonuçları önbellekte saklanır ve sonraki çalıştırma sonucunda alınır.
bazel clean
çalıştır. 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
INFO
satırını kontrol edin.remote cache hit
veinternal
dışında işlem görmüyorsanız önbelleğiniz doğru şekilde dolduruluyor ve ona doğru şekilde erişiliyor demektir. Bu durumda, sonraki bölüme geçin.Tutarsızlık kaynağı, derlemede hermetik olmayan ve işlemlerin iki çalıştırmada farklı işlem anahtarları almasına neden olan bir şeydir. 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_compact_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 da aynı olduğundan emin olun. Tutarsızlıklar, çalıştırmalar arasında meydana gelen değişiklikler hakkında bir ipucu sağlar. 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şlemlerde
cacheable
öğesinin doğru değerine ayarlandığından emin olun.cacheable
bir veri işlemine ait yürütme günlüğündecacheable
görünmüyorsa ilgili kuralınBUILD
dosyasındaki tanımında birno-cache
etiketi olabilir. İşlemin kaynağını belirlemek için yürütme günlüğündekimnemonic
vetarget_label
alanlarına bakın.İşlemler aynıysa ve
cacheable
önbellek isabeti yoksa komut satırınızda--noremote_accept_cached
bulunabilir. Bu durumda, derleme için önbellek 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.txt
ekleyin.b. Günlüğün metin sürümünü açın ve
command_line_label: "canonical"
içerenstructured_command_line
mesajını arayın. Genişletildikten sonra tüm seçenekler listelenir.c.
remote_accept_cached
araması yapın vefalse
olarak ayarlanıp ayarlanmadığını kontrol edin.d.
remote_accept_cached
değerifalse
ise komut satırında veya bazelrc dosyasındafalse
olarak ayarlanacağı yeri belirleyin.
Makinelerde önbelleğe almayı sağlama
Aynı makinede önbelleğe isabetler beklendiği gibi gerçekleşmeye başladıktan 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_compact_file=/tmp/exec1.log
1. adımdaki değişikliğin dahil edildiğinden emin olarak derlemeyi ikinci makinede çalıştırın:
bazel clean
bazel ... 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ı, derlemelerden birine sızdıran ana makine ortamına ait özellikler ve tutarsızlıklar 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, aynı zamanda komut satırı bağımsız değişkenlerini, ortam değişkenlerini vb.) ve 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üğü şu üç biçimden birinde üretilebilir: kompakt (--execution_log_compact_file
), ikili (--execution_log_binary_file
) veya JSON (--execution_log_json_file
).
Çok küçük bir çalışma zamanı ek yükü ile çok daha küçük dosyalar ürettiğinden kompakt 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.log
ve/tmp/exec2.log
olarak saklayın.Bazel kaynak kodunu indirip
//src/tools/execlog:parser
aracını derleyin:git clone https://github.com/bazelbuild/bazel.git cd bazel bazel build //src/tools/execlog:parser
Günlükleri insanların okuyabileceği bir metin biçimine dönüştürmek için
//src/tools/execlog:parser
aracını kullanın. Bu biçimde, ikinci günlükteki işlemler, ilk günlükteki sıralamayla eşleşecek şekilde sıralanır. Böylece karşılaştırma yapmak kolaylaşır.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
ve/tmp/exec2.log.txt
arasındaki farkları ayırt etmek için en sevdiğiniz metni kullanın.