Bu sayfada, önbellek isabet oranınızı nasıl kontrol edeceğiniz ve uzak yürütme bağlamında önbellek isabeti olmaması durumlarını nasıl inceleyeceğiniz açıklanmaktadır.
Bu sayfada, uzaktan yürütmeyi başarıyla kullanan bir derleme ve/veya testiniz olduğu ve uzaktan önbelleği etkili bir şekilde kullandığınızdan emin olmak istediğiniz varsayılmaktadır.
Önbellek isabet oranınızı kontrol etme
Bazel çalıştırmanızın standart çıkışında, işlemleri listeleyen INFO
satırına bakın. Bu işlemler kabaca Bazel işlemlerine karşılık gelir. Bu satır, işlemin nerede çalıştırıldığını gösterir. Uzaktan yürütülen bir işlemi gösteren remote
etiketini, yerel bir 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 ö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 uzaktan önbellek isabeti vardı ve 2 işlemde önbellek isabeti yoktu. Bu işlemler uzaktan yürütüldü. 3 dahili bölümü yoksayılabilir.
Bu genellikle sembolik bağlantılar oluşturma gibi 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, ardından derleme/test komutunuzu çalıştırın.
Önbellek isabetleriyle ilgili sorunları giderme
Beklediğiniz önbellek isabet oranını elde etmiyorsanız aşağıdakileri yapın:
Aynı derleme/test komutunun tekrar çalıştırılmasının önbellek isabetleri oluşturduğundan emin olun.
Önbelleği doldurmasını 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 isabeti beklenmez. Uzaktan yürütme kapsamında işlem sonuçları önbellekte saklanır ve sonraki çalıştırmada bu sonuçlar alınır.
Koşu
bazel clean
. Bu komut, yerel önbelleğinizi temizler. Böylece, sonuçlar yerel önbellek isabetleriyle maskelenmeden uzak önbellek isabetlerini inceleyebilirsiniz.İncelediğiniz derlemeleri ve testleri aynı makinede tekrar çalıştırın.
Ö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 erişiliyor demektir. Bu durumda, sonraki bölüme geçin.Tutarsızlığın olası bir kaynağı, derlemede hermetik olmayan bir şeyin bulunmasıdır. Bu durum, işlemlerin iki çalıştırma arasında 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_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. Uyuşmazlıklar, çalıştırmalar arasında meydana gelen değişiklikler hakkında ipucu verir. Bu tutarsızlıkları gidermek için sürümünüzü güncelleyin.
Önbelleğe alma sorunlarını çözebildiyseniz ve tekrarlanan çalıştırma artık tüm önbellek isabetlerini üretiyorsa bir sonraki bölüme geçin.
İşlem kimlikleriniz aynıysa ancak önbellek isabeti yoksa yapılandırmanızdaki bir şey önbelleğe almayı engelliyor demektir. Sık karşılaşılan sorunları kontrol etmek için bu bölümle devam edin.
Yürütme günlüğündeki tüm işlemlerin
cacheable
değerinin doğru olarak ayarlandığını kontrol edin. Belirli bir işlem için yürütme günlüğündecacheable
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üğündekimnemonic
vetarget_label
alanlarına bakın.İşlemler aynı ve
cacheable
ise ancak önbellek isabeti yoksa komut satırınızda--noremote_accept_cached
bulunuyor olabilir. Bu da derleme için önbellek aramalarını devre dışı bırakır.Gerçek komut satırını belirlemek zor geliyorsa Oluşturma Etkinliği Protokolü'ndeki standart komut satırını aşağıdaki şekilde 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
structured_command_line
iletisinicommand_line_label: "canonical"
ile arayın. Genişletildikten sonra tüm seçenekler listelenir.c.
remote_accept_cached
ayarını arayı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 bazelrc dosyasında.
Makineler arasında önbelleğe almayı sağlama
Aynı makinede önbellek isabetleri beklendiği gibi gerçekleşmeye başladıktan sonra aynı derlemeleri/testleri farklı bir makinede çalıştırın. Önbelleğe almanın 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_compact_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_compact_file=/tmp/exec2.log
İki çalıştırma için 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 olup olmadığını ve ana makine ortamındaki özelliklerin derlemelerden birine sızıp sızmadığını araştırın.
Yürütme günlüklerini karşılaştırma
Yürütme günlüğünde, derleme sırasında yürütülen işlemlerin kayıtları bulunur. Her kayıt, hem girişleri (yalnızca dosyalar değil, aynı zamanda 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ı ek yüküyle çok daha küçük dosyalar oluşturduğu için sıkıştırılmış biçim önerilir. Aşağıdaki talimatlar tüm biçimler için geçerlidir. Ayrıca, //src/tools/execlog:converter
aracını kullanarak bu birimler arasında dönüşüm yapabilirsiniz.
Önbellek isabetlerini beklendiği gibi paylaşmayan iki derlemeyle ilgili günlükleri karşılaştırmak için aşağıdakileri yapın:
Her derlemenin 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ı oluşturun:git clone https://github.com/bazelbuild/bazel.git cd bazel bazel build //src/tools/execlog:parser
Günlükleri okunabilir 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ıraya göre 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 farkı bulmak için en sevdiğiniz metin karşılaştırma aracını kullanın.