Men-debug Hit Cache Jarak Jauh untuk Eksekusi Jarak Jauh

Laporkan masalah Lihat sumber {/18/}{/1/}

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 ingin memastikan bahwa Anda menggunakan cache jarak jauh secara efektif.

Memeriksa rasio cache ditemukan

Pada output standar dari proses Bazel, lihat baris INFO yang mencantumkan proses, yang kurang lebih sesuai dengan tindakan Bazel. Baris tersebut menjelaskan tempat tindakan dijalankan. Cari label remote, yang menunjukkan tindakan yang dijalankan dari jarak jauh, linux-sandbox untuk tindakan yang dijalankan di sandbox lokal, dan nilai lainnya untuk strategi eksekusi lainnya. Tindakan yang hasilnya berasal 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 dijalankan dari jarak jauh. Tiga bagian internal dapat diabaikan. Ini biasanya merupakan tindakan internal kecil, seperti membuat tautan simbolis. Hit cache lokal tidak disertakan dalam ringkasan ini. Jika Anda mendapatkan 0 proses (atau angka yang lebih rendah dari yang diharapkan), jalankan bazel clean diikuti dengan perintah build/test Anda.

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. Saat pertama kali build baru dijalankan pada stack tertentu, Anda mungkin tidak akan menemui cache jarak jauh. Sebagai bagian dari eksekusi jarak jauh, hasil tindakan disimpan dalam cache dan proses berikutnya akan mendeteksinya.

  2. Jalankan bazel clean. Perintah ini membersihkan cache lokal, yang memungkinkan Anda menyelidiki ditemukannya cache jarak jauh tanpa menyamarkan hasilnya oleh cache lokal.

  3. Jalankan build dan uji yang Anda selidiki lagi (di mesin yang sama).

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

  5. Kemungkinan sumber perbedaan adalah sesuatu yang non-hermetik dalam build yang menyebabkan tindakan menerima kunci tindakan yang berbeda di kedua proses tersebut. Untuk menemukan tindakan tersebut, lakukan langkah 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 di antara kedua proses tersebut. Pastikan tindakan di kedua file log tersebut sama. Perbedaan memberikan petunjuk tentang perubahan yang terjadi di antara operasi. Update build Anda untuk menghilangkan perbedaan tersebut.

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

    Jika ID tindakan Anda identik tetapi tidak ada hit cache, sesuatu dalam konfigurasi Anda akan mencegah caching. Lanjutkan dengan bagian ini untuk memeriksa masalah umum.

    Jika tidak perlu membedakan log eksekusi, Anda dapat menggunakan tanda --execution_log_json_file yang dapat dibaca manusia. Class ini tidak dapat digunakan untuk diffing stabil karena berisi waktu eksekusi dan tidak menjamin pengurutan.

  6. Pastikan cacheable untuk semua tindakan di log eksekusi disetel ke benar (true). Jika cacheable tidak muncul di log eksekusi untuk tindakan berikan, berarti aturan yang sesuai mungkin memiliki tag no-cache dalam definisinya di file BUILD. Lihat kolom progress_message yang dapat dibaca manusia di log eksekusi untuk membantu menentukan asal tindakan.

  7. Jika tindakannya identik dan cacheable tetapi tidak ada cache ditemukan, ada kemungkinan 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 command line kanonik dari Build Event Protocol sebagai berikut:

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

    b. Buka log versi teks dan telusuri pesan structured_command_line 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 tempatnya ditetapkan ke false: di command line atau dalam file bazelrc.

Memastikan caching di seluruh mesin

Setelah cache ditemukan terjadi seperti yang diharapkan pada komputer yang sama, jalankan build/pengujian yang sama di mesin lain. Jika Anda menduga bahwa penyimpanan cache tidak terjadi di semua komputer, lakukan tindakan 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, dengan memastikan modifikasi dari langkah 1 disertakan:

     bazel clean
     bazel ... build ... --execution_log_binary_file=/tmp/exec2.log
    
  4. Bandingkan log eksekusi untuk kedua proses yang berjalan. Jika log tidak identik, periksa perbedaan konfigurasi build Anda, serta properti dari lingkungan host yang bocor ke salah satu build.

Membandingkan log eksekusi

Log eksekusi berisi catatan semua tindakan yang dieksekusi selama build. Untuk setiap tindakan, terdapat elemen SpawnExec yang berisi semua informasi dari tombol tindakan. Jadi, jika log identik, begitu juga kunci cache tindakan.

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

  1. Dapatkan log eksekusi dari setiap build dan simpan sebagai /tmp/exec1.log dan /tmp/exec2.log.

  2. Download kode sumber Bazel dan buka folder Bazel dengan menggunakan perintah di bawah ini. Anda memerlukan 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. Pemanggilan berikut juga mengurutkan tindakan di log kedua agar sesuai dengan urutan tindakan di log pertama untuk memudahkan 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 membedakan /tmp/exec1.log.txt dan /tmp/exec2.log.txt.