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, başarılı bir şekilde tamamlanan bir derleme ve/veya testiniz olduğu varsayılır. uzaktan yürütme yöntemlerinden birini kullanıyorsanız ve elinizdeki karar verebilirsiniz.

Önbellek isabet oranınızı kontrol etme

Bazel çalıştırmanızın standart çıkışında, aşağıdaki listede yer alan INFO satırına bakın: süreçleri ve süreçleri oluşturmanız gerekir. 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 gelen bir işlem uzak bir önbellekten gelen 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 vardı ve 2 işlemde ve uzaktan çalıştırıldı. 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. Hiçbir işlem alıyorsanız (veya beklenenden küçük bir sayı) çalıştırmak için bazel clean komutunu çalıştırın ve ardından derleme/testinizi çalıştırın. komutunu kullanın.

Önbellek isabetleriyle 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

  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 ve böylece uzak önbellek isabetlerini Google Ads'e aktarmadan yerel önbellek isabetleridir.

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

  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. Muhtemelen tutarsızlık kaynağı, derlemede hermetik olmayan bir şeydir. iki çalıştırmada farklı işlem anahtarları alacak şekilde işlem yapar. 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_binary_file=/tmp/exec1.log
    

    b. iki koşu. İş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şturduğundan sonraki bölüme geçin.

    İş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şlemlerde cacheable öğesinin doğru değerine ayarlandığından emin olun. Eğer cacheable, belirtilen bir işlem için yürütme günlüğünde görünmüyor. karşılık gelen kuralınno-cache tanımıdır.BUILD 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 önbellek isabeti yoksa komut satırınızda --noremote_accept_cached var olan derleme için önbellek aramalarını devre dışı bırakır.

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

    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 araması yapı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.

Makinelerde önbelleğe almayı sağlama

Önbellek isabetleri aynı makinede beklendiği gibi gerçekleştikten sonra farklı bir makinede aynı derleme/testler olmalıdır. Önbelleğe almanın yoksa 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_binary_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_binary_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ükleri, derleme sırasında yürütülen tüm işlemlerin kayıtlarını içerir. Örneğin, her işlemin bir SpawnExec anahtarındaki tüm bilgileri içeren bir öğedir. Dolayısıyla, günlükler de aynı şekilde işlem önbellek anahtarlarıdır.

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

  2. Bazel kaynak kodunu indirin ve şunu kullanarak Bazel klasörüne gidin: aşağıdaki komutu kullanın. execlog ayrıştırıcı'dır.

    git clone https://github.com/bazelbuild/bazel.git
    cd bazel
    
  3. 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ğıdakiler çağrısı, ikinci günlükteki işlemleri de işlem sırasına göre sıralar. ilk günlüğe eklemeniz gerekir.

    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
    
  4. /tmp/exec1.log.txt ve /tmp/exec2.log.txt.