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ı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ı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. 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 önbellek isabeti gerçekleşmiş, 2 işlem önbellek isabeti içermeyen 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 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. Bu komut, yerel önbelleğinizi temizler. Böylece, sonuçlar yerel önbellek isabetleri tarafından maskelenmeden uzak önbellek isabetlerini inceleyebilirsiniz.Araştırdığınız 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 herhangi bir işlem görmüyorsanız önbelleğiniz doğru şekilde dolduruluyor ve önbelleğe erişiliyor demektir. Bu durumda, bir sonraki bölüme geçin.Tutarsızlıkların olası bir nedeni, 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 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 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 önbellek isabeti yoksa yapılandırmanızdaki bir şey önbelleğe almayı engelliyordur. Sık karşılaşılan sorunları kontrol etmek için bu bölüme geçin.
Yürütme günlüklerini karşılaştırmanız gerekmiyorsa bunun yerine kullanıcı tarafından okunabilen
--execution_log_json_file
işaretini kullanabilirsiniz. Yürütme süresini içerdiği ve sıralamayı garanti etmediği için kararlı karşılaştırma için kullanılamaz.Yürütme günlüğündeki tüm işlemlerin
cacheable
değerinin doğru olarak ayarlandığından emin olun.cacheable
, belirli bir işlemin yürütme günlüğünde görünmüyorsa ilgili kuralınBUILD
dosyasındaki tanımındano-cache
etiketi olabilir. İşlemin nereden geldiğini belirlemek için yürütme günlüğündeki kullanıcı tarafından okunabilirprogress_message
alanı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 Etkinlik Oluşturma 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
ekleyin.b. Günlüğün metin sürümünü açın ve
command_line_label: "canonical"
ile başlayanstructured_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
false
isefalse
olarak 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
Önbellek isabetleri aynı makinede beklendiği gibi gerçekleştikten sonra, farklı bir makinede aynı derlemeleri/testleri çalıştırın. Önbelleğe alma işleminin makineler arasında gerçekleşmediğinden şüpheleniyorsanız aşağıdakileri yapın:
Mevcut önbellekleri kullanmamak 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
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_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ı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ü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. Dolayısıyla, günlükler aynıysa işlem önbellek anahtarları da aynı şekildedir.
Ö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 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ısını kullanın. Aşağıdaki çağrı, karşılaştırma kolaylığı için ikinci günlükteki işlemleri ilk günlükteki işlem sırasına göre de 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
ve/tmp/exec2.log.txt
arasındaki farkları ayırt etmek için en sevdiğiniz metni kullanın.