Men-debug Hit Cache Jarak Jauh untuk Eksekusi Jarak Jauh

Laporkan masalah Lihat sumber

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 menggunakan cache jarak jauh secara efektif.

Memeriksa rasio cache ditemukan

Dalam output standar proses Bazel Anda, lihat baris INFO yang mencantumkan proses, yang kira-kira sesuai dengan tindakan Bazel. Baris detail tersebut di mana tindakan tersebut 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 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 hit cache serta dijalankan dari jarak jauh. Tiga bagian internal dapat diabaikan. Hal ini biasanya berupa 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/pengujian Anda.

Memecahkan masalah cache ditemukan

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

Memastikan bahwa menjalankan kembali perintah build/test yang sama menghasilkan cache ditemukan

  1. Jalankan build dan/atau pengujian yang Anda harapkan akan diisi cache. Saat pertama kali build baru dijalankan pada stack tertentu, kemungkinan tidak akan ada cache jarak jauh ditemukan. Sebagai bagian dari eksekusi jarak jauh, hasil tindakan disimpan dalam cache, dan proses selanjutnya akan mengambilnya.

  2. Jalankan bazel clean. Perintah ini membersihkan cache lokal sehingga Anda dapat menyelidiki hit cache jarak jauh tanpa menyamarkan hasilnya oleh hit cache lokal.

  3. Jalankan build dan pengujian yang sedang Anda selidiki lagi (di komputer yang sama).

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

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

    Jika Anda dapat menyelesaikan masalah caching dan sekarang operasi berulang menghasilkan semua cache ditemukan, lewati ke bagian berikutnya.

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

  6. Pastikan semua tindakan di log eksekusi memiliki cacheable yang disetel ke benar (true). Jika cacheable tidak muncul di log eksekusi untuk tindakan yang diberikan, artinya aturan yang terkait mungkin memiliki tag no-cache dalam definisinya di file BUILD. Lihat kolom mnemonic dan target_label di log eksekusi untuk membantu menentukan asal tindakan.

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

    Jika sulit untuk menemukan command line yang sebenarnya, gunakan command line kanonis dari Build Event Protocol seperti 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 sudah disetel ke false.

    d. Jika remote_accept_cached adalah false, tentukan tempatnya ditetapkan ke false: di command line atau di file bazelrc.

Memastikan penyimpanan cache di seluruh komputer

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

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

  2. Jalankan build di komputer pertama:

     bazel clean
     bazel ... build ... --execution_log_binary_file=/tmp/exec1.log
    
  3. Jalankan build di mesin 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 tersebut. 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 semua tindakan yang dijalankan selama proses build. Untuk setiap tindakan, ada elemen SpawnExec yang berisi semua informasi dari tombol tindakan. Jadi, jika log identik, begitu pula kunci cache tindakan.

Agar dapat membandingkan log untuk dua build yang tidak membagikan hit cache 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 parser execlog.

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