Men-debug Hit Cache Jarak Jauh untuk Eksekusi Jarak Jauh

Laporkan masalah Lihat sumber Per Malam · 7,3 · 7,2 · 7,1 · 7,0 · 6,5

Halaman ini menjelaskan cara memeriksa rasio cache ditemukan dan cara menyelidiki cache tidak ditemukan dalam konteks eksekusi jarak jauh.

Halaman ini mengasumsikan bahwa Anda memiliki build dan/atau pengujian yang berhasil menggunakan eksekusi jarak jauh, dan Anda ingin memastikan bahwa Anda efektif menggunakan {i>cache<i} jarak jauh.

Memeriksa rasio cache ditemukan

Pada output standar dari proses Bazel Anda, lihat baris INFO yang mencantumkan yang kurang lebih berkaitan dengan tindakan Bazel. Detail baris tersebut tempat tindakan dijalankan. Cari label remote, yang menunjukkan tindakan dijalankan dari jarak jauh, linux-sandbox untuk tindakan yang dijalankan di sandbox lokal, dan nilai lain untuk strategi eksekusi lainnya. Suatu tindakan yang hasilnya muncul dari cache jarak jauh akan ditampilkan sebagai remote cache hit.

Contoh:

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

Dalam contoh ini ada 6 hit cache jarak jauh, dan 2 tindakan tidak memiliki cache ditemukan dan dieksekusi dari jarak jauh. Tiga bagian internal dapat diabaikan. Ini biasanya merupakan tindakan internal kecil, seperti membuat tautan simbolis. Lokal cache ditemukan tidak termasuk dalam ringkasan ini. Jika Anda mendapatkan 0 proses (atau angka yang lebih rendah dari yang diharapkan), jalankan bazel clean diikuti dengan build/pengujian Anda perintah.

Pemecahan masalah cache ditemukan

Jika Anda tidak mendapatkan rasio cache ditemukan yang diharapkan, lakukan hal berikut:

Memastikan menjalankan kembali perintah build/test yang sama akan menghasilkan hit cache

  1. Jalankan build dan/atau pengujian yang Anda harapkan untuk mengisi cache. Tujuan pertama kali build baru dijalankan pada stack tertentu, Anda mungkin tidak akan melakukan cache ditemukan. Sebagai bagian dari eksekusi jarak jauh, hasil tindakan disimpan di {i>cache<i} dan proses selanjutnya akan mendeteksinya.

  2. Jalankan bazel clean. Perintah ini membersihkan {i> cache<i} lokal Anda, yang memungkinkan Anda untuk menyelidiki hit cache jarak jauh tanpa hasilnya tertutup oleh cache lokal.

  3. Jalankan build dan uji yang Anda selidiki lagi (dengan cara yang sama komputer).

  4. Periksa baris INFO untuk melihat rasio cache ditemukan. Jika Anda tidak melihat proses kecuali remote cache hit dan internal, berarti cache Anda telah diisi dengan benar dan diakses. Jika demikian, lanjutkan ke bagian berikutnya.

  5. Kemungkinan sumber perbedaan adalah sesuatu yang non-hermetik dalam build yang menyebabkan tindakan untuk menerima kunci tindakan yang berbeda di kedua proses tersebut. Untuk menemukan tindakan tersebut, lakukan hal berikut:

    a. Jalankan kembali build atau pengujian yang dimaksud untuk mendapatkan log eksekusi:

      bazel clean
      bazel --optional-flags build //your:target --execution_log_binary_file=/tmp/exec1.log
    

    b. Bandingkan log eksekusi antara dua sesi. Pastikan tindakan di kedua file log tersebut sama. Perbedaan memberikan petunjuk tentang perubahan yang terjadi antara yang dijalankan. Update build Anda untuk menghilangkan perbedaan tersebut.

    Jika Anda dapat menyelesaikan masalah penyimpanan dalam cache dan setelah operasi berulang menghasilkan semua hit cache, langsung ke bagian berikutnya.

    Jika ID tindakan Anda identik tetapi tidak ada cache ditemukan, di konfigurasi Anda akan mencegah penyimpanan cache. Lanjutkan dengan bagian ini untuk memeriksa masalah yang umum terjadi.

  6. Pastikan cacheable untuk semua tindakan di log eksekusi disetel ke benar (true). Jika cacheable tidak muncul di log eksekusi untuk tindakan berikan, yang berarti aturan yang sesuai mungkin memiliki tag no-cache di dalam file BUILD. Lihat mnemonic dan target_label di log eksekusi untuk membantu menentukan arah tindakan dari mereka.

  7. Jika tindakan identik dan cacheable tetapi tidak ada cache yang ditemukan, mungkin command line Anda menyertakan --noremote_accept_cached yang akan menonaktifkan pencarian cache untuk sebuah build.

    Jika sulit untuk mencari tahu command line yang sebenarnya, gunakan kanonis command line dari Protokol Peristiwa Build sebagai berikut:

    a. Tambahkan --build_event_text_file=/tmp/bep.txt ke perintah Bazel Anda untuk mendapatkan log versi teks.

    b. Buka log versi teks dan telusuri structured_command_line pesan dengan command_line_label: "canonical". Tindakan ini akan mencantumkan semua opsi setelah perluasan.

    c. Telusuri remote_accept_cached dan periksa apakah parameter ini disetel ke false.

    d. Jika remote_accept_cached adalah false, tentukan di mana letaknya ditetapkan ke false: baik di command line maupun di bazelrc.

Memastikan caching di seluruh mesin

Setelah cache ditemukan terjadi seperti yang diharapkan di komputer yang sama, jalankan build/pengujian yang sama pada komputer yang berbeda. Jika Anda mencurigai bahwa {i>caching<i} adalah tidak terjadi di komputer, lakukan hal berikut:

  1. Buat modifikasi kecil pada build Anda untuk menghindari mencapai cache yang sudah ada.

  2. Jalankan build di komputer pertama:

     bazel clean
     bazel ... build ... --execution_log_binary_file=/tmp/exec1.log
    
  3. Jalankan build di komputer kedua, pastikan modifikasi dari langkah 1 adalah termasuk:

     bazel clean
     bazel ... build ... --execution_log_binary_file=/tmp/exec2.log
    
  4. Bandingkan log eksekusi untuk keduanya yang dijalankan. Jika log tidak identik, selidiki konfigurasi build Anda untuk perbedaan serta kebocoran properti dari lingkungan {i>host<i} ke salah satu build.

Membandingkan log eksekusi

Log eksekusi berisi catatan semua tindakan yang dieksekusi selama build. Sebagai setiap tindakan, ada SpawnExec yang berisi semua informasi dari kunci tindakan. Jadi, jika log identik, demikian pula dengan kunci {i>cache<i} tindakan.

Untuk membandingkan log dua build yang tidak berbagi hit cache seperti yang diharapkan, lakukan hal berikut:

  1. Mendapatkan log eksekusi dari setiap build dan menyimpannya sebagai /tmp/exec1.log, serta /tmp/exec2.log.

  2. Unduh kode sumber Bazel dan navigasikan ke folder Bazel dengan menggunakan perintah di bawah ini. Anda perlu kode sumber untuk mengurai log eksekusi dengan Parser eksekusi.

    git clone https://github.com/bazelbuild/bazel.git
    cd bazel
    
  3. Gunakan parser log eksekusi untuk mengonversi log menjadi teks. Hal berikut pemanggilan juga mengurutkan tindakan di log kedua agar sesuai dengan urutan tindakan di log pertama untuk kemudahan perbandingan.

    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. Gunakan teks favorit Anda yang berbeda untuk perbedaan /tmp/exec1.log.txt dan /tmp/exec2.log.txt.