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

Sorun bildir Kaynağı göster Gece · 7,3 · 7,2 · 7,1 · 7,0 · 6,5

Bu sayfada, önbellek isabet oranınızı nasıl kontrol edeceğiniz ve nasıl araştıracağınız açıklanmaktadır uzaktan yürütme bağlamında önbellekte yok.

Bu sayfada, uzaktan yürütmeyi başarıyla kullanan bir derlemeniz ve/veya testiniz olduğu ve uzaktan ö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ın ayrıntıları işlemin yapıldığı yeri gösterir. Bir işlemi belirten remote etiketini bulun uzaktan gerçekleştirildi, yerel korumalı alanda yürütülen işlemler için linux-sandbox, ve diğer yürütme stratejileri için diğer değerlere sahiptir. 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 değildir. 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

  1. Önbelleği doldurmasını beklediğiniz derlemeleri ve/veya testleri çalıştırın. İlgili içeriği oluşturmak için kullanılan yığında yeni bir derleme ilk kez çalıştırıldığında uzaktan kumanda emin olun. Uzaktan yürütmenin bir parçası olarak işlem sonuçları şurada saklanır: daha sonraki bir çalıştırma sonucunda otomatik olarak algılanır.

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

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

  4. Önbellek isabet oranı için INFO satırını kontrol edin. Herhangi bir işlem remote cache hit ve internal, önbelleğiniz doğru şekilde dolduruluyor ve erişilebilir. Bu durumda, bir sonraki bölüme geçin.

  5. Tutarsızlık olası bir kaynağı, derlemedeki hermetik olmayan bir şeyin, işlemlerin iki çalıştırma boyunca farklı işlem anahtarları almasına neden olmasıdır. Mevcut gerçekleştirdikten sonra, 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, bir tarih aralığı için koşar. Bu tutarsızlıkları ortadan kaldırmak için derlemenizi güncelleyin.

    Önbelleğe alma sorunlarını çözebiliyorsanız ve artık tekrarlanan çalıştırma tüm önbellek isabetlerini oluşturuyorsa bir sonraki bölüme atlayın.

    İşlem kimlikleriniz aynıysa ancak önbellek isabeti yoksa önbelleğine almayı engelliyor. Aşağıdaki işlemler için bu bölümden devam edin: kontrol edebilirsiniz.

  6. 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ın BUILD dosyasındaki tanımında no-cache etiketi olabilir. mnemonic ve target_label bölümlerine bakın alanların nereye yerleştirileceğini belirlemeye yardımcı olmak için var.

  7. İşlemler aynıysa ve cacheable ise ancak önbelleğe isabet yoksa komut satırınızda --noremote_accept_cached olabilir. Bu durumda, derleme için önbelleğe aramalar devre dışı bırakılır.

    Gerçek komut satırını bulmak zorsa standart komut satırından Etkinlik Protokolü Oluşturma şu şekildedir:

    a. Aşağıdakileri almak için Bazel komutunuza --build_event_text_file=/tmp/bep.txt ekleyin: günlüğün metin sürümü.

    b. Günlüğün metin sürümünü açın ve command_line_label: "canonical" ile structured_command_line mesaj. Genişletme işleminden sonra tüm seçenekler listelenir.

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

    d. remote_accept_cached değeri false ise nerede olduğunu belirleyin false olarak ayarlayın: komut satırında veya bazelrc dosyası olarak ayarlayın.

Makineler arasında önbelleğe alma işleminin yapıldığından emin olun

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. Makinelerde önbelleğe alma işleminin yapılmadığından şüpheleniyorsanız aşağıdakileri yapın:

  1. Mevcut önbelleklere ulaşmamak 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. 1. adımdaki değişikliği kontrol ederek derlemeyi ikinci makinede çalıştırın şunları içerir:

     bazel clean
     bazel ... build ... --execution_log_compact_file=/tmp/exec2.log
  4. İkisi için yürütme günlüklerini karşılaştırın koşar. Günlükler aynı değilse derleme yapılandırmalarınızı inceleyin hem de ana makine ortamı sızıntılarından gelen özellikler için devreye girer.

Yürütme günlüklerini karşılaştırma

Yürütme günlüğü, derleme sırasında yürütülen işlemlerin kayıtlarını içerir. Her kayıt, hem girişleri (yalnızca dosyalar değil, komut satırı bağımsız değişkenleri, ortam değişkenleri vb.) hem de işlemin çıkışlarını açıklar. Böylece, günlüğün incelenmesi, bir işlemin neden yeniden gerçekleştirildiğini ortaya çıkarabilir.

Yürütme günlüğü şu üç biçimden birinde oluşturulabilir: kompakt (--execution_log_compact_file), ikili program (--execution_log_binary_file) veya JSON (--execution_log_json_file) Çok küçük boyutlu dosyalar ürettiğinden, kompakt biçim önerilir. çalışma zamanı ek yükü getirir. Aşağıdaki talimatlar tüm biçimler için geçerlidir. Siz , //src/tools/execlog:converter aracını kullanarak bunlar arasında dönüşüm de yapabilir.

Önbellek isabetlerini beklendiği gibi paylaşmayan iki derlemenin günlüklerini karşılaştırmak için: şunları yapın:

  1. Her derlemeden 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ı derleyin:

    git clone https://github.com/bazelbuild/bazel.git cd bazel Bazel build //src/tools/execlog:parser

  3. Günlükleri bir kampanyaya dönüştürmek için //src/tools/execlog:parser aracını kullanın: metin biçimine uyarlar. Bu biçimde, ikinci günlükteki işlemler ilk günlükteki sıraya göre sıralanır. Bu sayede karşılaştırma daha kolay olur.

    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. Farklılaştırma için /tmp/exec1.log.txt ve /tmp/exec2.log.txt ile favori metninizi kullanın.