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 uzaktan yürütme bağlamında önbellek isabetlerini nasıl araştıracağınız açıklanmaktadır.

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, işlemin nerede çalıştırıldığını belirtir. Uzaktan yürütülen 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 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 iç parça yoksayılabilir. Bu genellikle sembolik bağlantı oluşturma gibi küçük dahili işlemlerdir. Yerel önbellek isabet sayısı bu özete dahil edilmemiştir. 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. Belirli bir yığınta yeni bir derleme ilk kez çalıştırıldığında uzak önbelleğe isabet olmaz. Uzaktan yürütme kapsamında işlem sonuçları önbelleğe depolanır ve sonraki bir çalıştırma işleminde bu sonuçlar alınır.

  2. bazel clean'ü çalıştırın. Bu komut, yerel önbelleğinizi temizler. Böylece, sonuçlar yerel önbellek isabetleri tarafından maskelenmeden uzak önbellek isabetlerini inceleyebilirsiniz.

  3. Araştırdığınız 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 herhangi bir işlem görmüyorsanız önbelleğiniz doğru şekilde dolduruluyor ve önbelleğe 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_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 da aynı olduğundan emin olun. Tutarsızlıklar, çalıştırmalar arasında gerçekleşen değişiklikler hakkında ipucu verir. 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 geçin.

    Yürütme günlüklerini farklılaştırmanız gerekmiyorsa bunun yerine insan tarafından okunabilir --execution_log_json_file işaretini kullanabilirsiniz. Yürütme süresi içerdiği ve sıralamayı garanti etmediği için kararlı dağılım için kullanılamaz.

  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. İşlemin nereden geldiğini belirlemek için yürütme günlüğündeki kullanıcı tarafından okunabilir progress_message alanına bakın.

  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 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" ile başlayan structured_command_line mesajını arayın. Genişletildikten 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 false ise false olarak nerede ayarlandığını belirleyin: komut satırında veya bir bazelrc dosyasında.

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_binary_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_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ızı, tutarsızlıklar ve barındırma ortamındaki mülklerin derlemelerden birine sızması açısından inceleyin.

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 vardır. Dolayısıyla, günlükler aynıysa işlem önbelleği anahtarları da aynıdır.

Önbellek isabetlerini 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 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ısını kullanın. Aşağıdaki çağrı, karşılaştırma kolaylığı için ikinci günlükteki işlemleri ilk günlükteki işlem sırasına göre de 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 ve /tmp/exec2.log.txt arasındaki farkları ayırt etmek için en sevdiğiniz metni kullanın.