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

Sorun bildirme Kaynağı görüntüleme Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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

Bu sayfada, uzaktan yürütmeyi başarılı bir şekilde kullanan bir derleme ve/veya teste sahip olduğunuz ve uzak ö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ırmanızın standart çıkışında, kabaca Bazel işlemlerine karşılık gelen işlemleri listeleyen INFO satırına bakın. Bu satırda, eylemin nerede gerçekleştirildiği Bir işlemin uzaktan yürütüldüğünü belirten remote etiketini, yerel korumalı alanda yürütülen işlemler için linux-sandbox değerini ve diğer yürütme stratejileri için diğer değerleri bulun. 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 edilmez. 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 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. Belirli bir yığınta yeni bir derleme ilk kez çalıştırıldığında uzak önbelleğe isabet olmaz. Uzaktan yürütmenin bir parçası olarak işlem sonuçları önbellekte saklanır ve sonraki çalıştırma sonucunda alını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. remote cache hit ve internal dışında işlem görmüyorsanız önbelleğiniz doğru şekilde dolduruluyor ve ona doğru şekilde erişiliyor demektir. Bu durumda, sonraki bölüme geçin.

  5. Tutarsızlık kaynağı, derlemede hermetik olmayan ve işlemlerin iki çalıştırmada farklı işlem anahtarları almasına neden olan bir şeydir. 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. Tutarsızlıklar, çalıştırmalar arasında meydana gelen değişiklikler hakkında bir ipucu sağlar. Bu tutarsızlıkları ortadan kaldırmak için derlemenizi güncelleyin.

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

    İşlem kimlikleriniz aynıysa ancak önbelleğe alma isabeti yoksa yapılandırmanızda önbelleğe almayı engelleyen bir şey vardır. Sık karşılaşılan sorunları kontrol etmek için bu bölüme devam edin.

  6. Yürütme günlüğündeki tüm işlemlerde cacheable öğesinin doğru değerine ayarlandığından emin olun. cacheable bir veri işlemine ait yürütme günlüğünde cacheable görünmüyorsa ilgili kuralın BUILD dosyasındaki tanımında bir no-cache etiketi olabilir. İşlemin kaynağını belirlemek için yürütme günlüğündeki mnemonic ve target_label alanlarına bakın.

  7. İşlemler aynıysa ve cacheable önbellek isabeti yoksa komut satırınızda --noremote_accept_cached bulunabilir. Bu durumda, derleme için önbellek aramaları devre dışı bırakılır.

    Gerçek komut satırını bulmak zorsa Build Event Protocol'daki 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 ekleyin.

    b. Günlüğün metin sürümünü açın ve command_line_label: "canonical" içeren structured_command_line mesajını arayın. Genişletildikten 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 komut satırında veya bazelrc dosyasında false olarak ayarlanacağı yeri belirleyin.

Makinelerde önbelleğe almayı sağlama

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. Ö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_compact_file=/tmp/exec1.log
  3. 1. adımdaki değişikliğin dahil edildiğinden emin olarak derlemeyi ikinci makinede çalıştırın:

     bazel clean
     bazel ... build ... --execution_log_compact_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ızı, derlemelerden birine sızdıran ana makine ortamına ait özellikler ve tutarsızlıklar açısından inceleyin.

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

Yürütme günlüğü, derleme sırasında gerçekleştirilen işlemlerin kayıtlarını içerir. Her kayıt hem girişleri (yalnızca dosyaları değil, aynı zamanda komut satırı bağımsız değişkenlerini, ortam değişkenlerini vb.) ve 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üğü şu üç biçimden birinde üretilebilir: kompakt (--execution_log_compact_file), ikili (--execution_log_binary_file) veya JSON (--execution_log_json_file). Çok küçük bir çalışma zamanı ek yükü ile çok daha küçük dosyalar ürettiğinden kompakt biçim önerilir. Aşağıdaki talimatlar tüm biçimler için geçerlidir. //src/tools/execlog:converter aracını kullanarak da bunları dönüştürebilirsiniz.

Önbelleğe alınan isabetleri beklendiği gibi 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 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 insanların okuyabileceği bir 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ıralamayla eşleşecek şekilde 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 farkları ayırt etmek için en sevdiğiniz metni kullanın.