Uzaktan Yürütme İçin Uzak Önbellek İsabetlerinde Hata Ayıklama

Sorun bildir Kaynağı görüntüle Nightly · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

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.

  1. Ö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.

  2. Koşu bazel clean. Bu komut, yerel önbelleğinizi temizler. Böylece, sonuçlar yerel önbellek isabetleriyle maskelenmeden uzak önbellek isabetlerini inceleyebilirsiniz.

  3. İncelediğiniz derlemeleri ve testleri aynı makinede tekrar çalıştırın.

  4. Önbellek isabet oranı için INFO satırını kontrol edin. remote cache hit ve internal 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.

  5. 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.

  6. 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üğünde cacheable görünmüyorsa ilgili kuralın BUILD dosyasındaki tanımında no-cache etiketi olabilir. İşlemin nereden geldiğini belirlemek için yürütme günlüğündeki mnemonic ve target_label alanlarına bakın.

  7. İş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 iletisini command_line_label: "canonical" ile arayın. Genişletildikten sonra tüm seçenekler listelenir.

    c. remote_accept_cached ayarını arayın ve false olarak ayarlanıp ayarlanmadığını kontrol edin.

    d. remote_accept_cached, false ise false 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:

  1. Mevcut önbellekleri kullanmamak için derlemenizde küçük bir değişiklik yapın.

  2. Derlemeyi ilk makinede çalıştırın:

     bazel clean
     bazel ... build ... --execution_log_compact_file=/tmp/exec1.log
  3. 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
  4. İ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:

  1. Her derlemenin yürütme günlüklerini alın ve bunları /tmp/exec1.log ve /tmp/exec2.log olarak saklayın.

  2. 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

  3. 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
    
  4. /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.