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

Sorun bildirin Kaynağı göster

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.

Önbellek 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 önbellek isabeti gerçekleşmiştir ve 2 işlem önbellek isabeti içermez 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. İşlem sayısı 0 (veya beklenenden 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 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ığında yeni bir derleme ilk kez çalıştırıldığında uzaktan önbellek isabeti bekleyebilirsiniz. Uzaktan yürütme kapsamında, 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. 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, bir 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 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ı çözebiliyorsanız ve artık 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. 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şlemlerde cacheable öğesinin doğru değerine ayarlandığından emin olun. cacheable bir get işlemi için yürütme günlüğünde görünmüyorsa ilgili kuralın BUILD dosyasındaki tanımında bir no-cache etiketi olabilir. İşlemin nereden geldiğini belirlemeye yardımcı olmak için yürütme günlüğündeki kullanıcılar tarafından okunabilen progress_message alanı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 Etkinlik Oluşturma 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 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ş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 komut satırında veya bazelrc dosyasında false olarak ayarlanacağı yeri belirleyin.

Makinelerde önbelleğe almayı sağlama

Önbellek isabetleri aynı makinede beklendiği gibi gerçekleştikten sonra, farklı bir makinede aynı derlemeleri/testleri ç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. 1. adımdaki değişikliğin eklendiğ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ı ve derlemelerden birine sızdırılan ana makine ortamının özelliklerini inceleyerek tutarsızlıklar olup olmadığını inceleyin.

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. Her işlem için işlem anahtarındaki tüm bilgileri içeren bir SpawnExec öğesi bulunur. Dolayısıyla, günlükler aynıysa işlem önbellek anahtarları da aynı şekildedir.

Ö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ığı sağlamak için ikinci günlükteki eylemleri de ilk günlükteki işlem sırasıyla eşleşecek ş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 ve /tmp/exec2.log.txt arasındaki farkları ayırt etmek için en sevdiğiniz metni kullanın.