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

Sorun bildir Kaynağı göster

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

Bu sayfa, uzaktan yürütmeyi başarılı bir şekilde kullanan bir derleme ve/veya teste sahip olduğunuzu ve uzak önbelleği etkili bir şekilde kullandığınızdan emin olmak istediğinizi varsayar.

Önbellek isabet oranınız kontrol ediliyor

Bazel çalıştırmanızın 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 yapıldığını belirtir. Uzaktan gerçekleştirilen bir işlemi belirten remote etiketini, yerel korumalı alanda yürütülen işlemler için linux-sandbox etiketini ve diğer yürütme stratejilerine ilişkin diğer değerleri bulun. Sonucu uzak bir önbellekten gelen işlem remote cache hit olarak görüntülenir.

Örneğin:

INFO: 11 processes: 6 remote cache hit, 3 internal, 2 remote.

Bu örnekte 6 uzak önbellek isabeti vardı ve 2 işlem önbellek isabeti içermiyor ve uzaktan yürütüldü. 3 dahili bölüm yoksayılabilir. Genellikle, sembolik bağlantılar oluşturmak gibi çok 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 ve ardından derleme/test komutunuzu çalıştırın.

Önbellek isabetleriyle ilgili sorunları giderme

Beklediğiniz önbellek isabeti oranını alamıyorsanız aşağıdakileri yapın:

Aynı derleme/test komutunun yeniden çalıştırılmasının önbellek isabetleri ürettiğinden emin olun

  1. Önbelleği doldurmayı 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 isabetleri bekleyebilirsiniz. Uzaktan yürütmenin bir parçası olarak, işlem sonuçları önbellekte depolanır ve sonraki bir çalıştırma işlemi bunları alır.

  2. bazel clean komutunu çalıştırın. Bu komut yerel önbelleğinizi temizler. Böylece, sonuçlar yerel önbellek isabetleri tarafından maskelenmeden uzaktan önbellek isabetlerini araştırabilirsiniz.

  3. Tekrar araştırdığınız derlemeleri ve testleri aynı makinede çalıştırın.

  4. Önbellek isabet oranı için INFO satırını kontrol edin. remote cache hit ve internal dışında hiçbir işlem görmüyorsanız önbelleğiniz doğru şekilde dolduruluyor ve erişiliyor demektir. Bu durumda bir sonraki bölüme geçin.

  5. Olası tutarsızlık kaynağı, derlemedeki hermetik olmayan bir şeydir. Bu durum, işlemlerin iki çalıştırma genelinde 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_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 aynı olduğundan emin olun. Tutarsızlıklar, çalıştırmalar arasında gerçekleşen değişiklikler hakkında ipucu sağlar. Bu tutarsızlıkları ortadan kaldırmak için derlemenizi güncelleyin.

    Önbelleğe alma sorunlarını çözebiliyorsanız ve şimdi tekrarlanan çalıştırma tüm önbellek 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. Yaygın sorunları kontrol etmek için bu bölüme geçin.

  6. Yürütme günlüğündeki tüm işlemlerde cacheable politikasının doğru değerine ayarlandığından emin olun. Bir verme işleminin yürütme günlüğünde cacheable görünmezse ilgili kuralın BUILD dosyasındaki tanımında no-cache etiketi olabilir. İşlemin nereden geldiğini belirlemeye yardımcı olması için yürütme günlüğündeki mnemonic ve target_label alanlarına bakın.

  7. İşlemler aynıysa ve cacheable ancak önbellek isabetleri yoksa komut satırınızda --noremote_accept_cached bulunuyor olabilir. Bu durum, bir derleme için önbellek aramalarını devre dışı bırakacaktır.

    Gerçek komut satırını anlamak zorsa Etkinlik Derleme 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 kodunu ekleyin.

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

    c. remote_accept_cached için arama yapın ve false olarak ayarlanıp ayarlanmadığını kontrol edin.

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

Makineler genelinde önbelleğe almayı sağlayın

Önbellek isabetleri aynı makinede beklendiği gibi gerçekleştikten sonra aynı derlemeleri/testleri farklı bir makinede çalıştırın. Önbelleğe alma işleminin makineler arasında gerçekleşmediğinden şü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_binary_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_binary_file=/tmp/exec2.log
    
  4. İ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ızda tutarsızlıklar ve derlemelerden birine sızan ana makine ortamındaki özellikleri araştırın.

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. Bu nedenle, günlükler aynıysa işlem önbellek anahtarları da vardır.

Beklendiği gibi önbellek isabetleri paylaşmayan iki derlemenin günlüklerini karşılaştırmak için aşağıdakileri yapın:

  1. Her derlemeden yürütme günlüklerini alın, /tmp/exec1.log ve /tmp/exec2.log olarak depolayın.

  2. 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
    
  3. Günlükleri metne dönüştürmek için yürütme günlüğü ayrıştırıcıyı kullanın. Aşağıdaki çağrı, karşılaştırma kolaylığı sağlamak için ikinci günlükteki işlemleri de ilk günlükteki işlem sırasına uyacak şekilde 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
    
  4. /tmp/exec1.log.txt ile /tmp/exec2.log.txt değerlerini ayırt etmek için en beğendiğiniz metni kullanın.