Men-debug Klik Cache Jarak Jauh untuk Eksekusi Jarak Jauh

Tetap teratur dengan koleksi Simpan dan kategorikan konten berdasarkan preferensi Anda.
Laporkan masalah Lihat sumber

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

Halaman ini mengasumsikan bahwa Anda memiliki build dan/atau pengujian yang berhasil memanfaatkan eksekusi jarak jauh, dan ingin memastikan bahwa Anda menggunakan cache jarak jauh secara efektif.

Memeriksa rasio cache ditemukan

Dalam output standar berjalannya Bazel, lihat baris INFO yang mencantumkan proses, yang kira-kira sesuai dengan tindakan Bazel. Detail baris tempat tindakan dijalankan. Cari label remote yang menunjukkan tindakan yang dieksekusi 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, terdapat 6 cache jarak jauh, dan 2 tindakan tidak memiliki cache ditemukan dan dieksekusi dari jarak jauh. 3 bagian internal dapat diabaikan. Ini biasanya tindakan internal yang kecil, seperti membuat tautan simbolis. 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.

Memecahkan masalah cache ditemukan

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

Pastikan untuk menjalankan kembali perintah build/test yang sama akan menghasilkan cache

  1. Jalankan build dan/atau pengujian yang Anda harapkan untuk mengisi cache. Saat pertama kali build baru dijalankan pada stack tertentu, Anda tidak akan dapat menemukan cache jarak jauh. Sebagai bagian dari eksekusi jarak jauh, hasil tindakan disimpan dalam cache dan proses berikutnya akan mengambilnya.

  2. Jalankan bazel clean. Perintah ini membersihkan cache lokal Anda, yang memungkinkan Anda menyelidiki hit cache jarak jauh tanpa membuat hasil untuk disamarkan oleh cache lokal.

  3. Jalankan build dan pengujian yang sedang diselidiki lagi (pada mesin yang sama).

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

  5. Kemungkinan sumber perbedaannya adalah sesuatu yang tidak dapat dibedakan dalam build yang menyebabkan tindakan menerima kunci tindakan yang berbeda untuk kedua eksekusi 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 kedua eksekusi. Pastikan bahwa tindakan tersebut identik di kedua file log. Ketidaksesuaian memberikan petunjuk tentang perubahan yang terjadi di antara proses. Update build Anda untuk menghilangkan perbedaan tersebut.

    Jika Anda dapat menyelesaikan masalah cache dan sekarang proses yang berulang menghasilkan semua hit cache, lanjutkan ke bagian berikutnya.

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

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

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

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

    Jika sulit untuk mencari command line sebenarnya, gunakan command line kanonis dari Build Event Protocol sebagai berikut:

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

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

    sekitar tahun Telusuri remote_accept_cached dan periksa apakah disetel ke false.

    d. Jika remote_accept_cached adalah false, tentukan tempat ditetapkan ke false: baik pada command line maupun dalam file bazelrc.

Memastikan cache di seluruh komputer

Setelah cache ditemukan seperti yang diharapkan pada mesin yang sama, jalankan build/pengujian yang sama pada komputer lain. Jika Anda menduga bahwa penyimpanan ke cache tidak terjadi di seluruh komputer, lakukan hal berikut:

  1. Lakukan perubahan kecil pada build Anda untuk menghindari cache yang ada.

  2. Jalankan build di mesin pertama:

     bazel clean
     bazel ... build ... --execution_log_binary_file=/tmp/exec1.log
    
  3. Jalankan build di mesin kedua untuk memastikan modifikasi dari langkah 1 disertakan:

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

Membandingkan log eksekusi

Log eksekusi berisi data dari semua tindakan yang dijalankan selama build. Untuk setiap tindakan terdapat elemen SpawnExec yang berisi semua informasi dari kunci tindakan. Jadi, jika log identik, kunci cache tindakan juga sama.

Untuk membandingkan log bagi dua build yang tidak berbagi cache ditemukan seperti yang diharapkan, lakukan langkah 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 menggunakan perintah di bawah ini. Anda memerlukan kode sumber untuk mengurai log eksekusi dengan parse parser eksekutif.

    git clone https://github.com/bazelbuild/bazel.git
    cd bazel
    
  3. Menggunakan parser log eksekusi untuk mengonversi log menjadi teks. Pemanggilan berikut juga mengurutkan tindakan dalam log kedua agar cocok dengan urutan tindakan pada 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.