Halaman ini menjelaskan cara memeriksa rasio hit cache dan cara menyelidiki cache yang 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 secara efektif menggunakan cache jarak jauh.
Memeriksa rasio hit cache
Pada output standar dari operasi Bazel, lihat baris INFO
yang mencantumkan
proses, yang kira-kira 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 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 dan dieksekusi dari jarak jauh. 3 bagian internal dapat diabaikan.
Biasanya, ini adalah tindakan internal kecil, seperti membuat link 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 hit cache
Jika Anda tidak mendapatkan rasio hit cache yang diharapkan, lakukan hal berikut:
Memastikan menjalankan kembali perintah build/pengujian yang sama menghasilkan hit cache
Jalankan build dan/atau pengujian yang Anda harapkan untuk mengisi cache. Saat pertama kali build baru dijalankan di stack tertentu, Anda tidak akan mendapatkan hit cache jarak jauh. Sebagai bagian dari eksekusi jarak jauh, hasil tindakan disimpan dalam cache dan operasi berikutnya harus mengambilnya.
Jalankan
bazel clean
. Perintah ini akan membersihkan cache lokal, yang memungkinkan Anda menyelidiki hit cache jarak jauh tanpa hasil yang disamarkan oleh hit cache lokal.Jalankan build dan pengujian yang Anda selidiki lagi (di mesin yang sama).
Periksa baris
INFO
untuk mengetahui rasio hit cache. Jika Anda tidak melihat proses kecualiremote cache hit
daninternal
, berarti cache Anda diisi dan diakses dengan benar. Jika demikian, lanjutkan ke bagian berikutnya.Sumber perbedaan yang mungkin terjadi adalah sesuatu yang tidak hermetis dalam build yang menyebabkan tindakan menerima kunci tindakan yang berbeda di kedua operasi. 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 operasi. Pastikan tindakannya sama di kedua file log. Perbedaan memberikan petunjuk tentang perubahan yang terjadi di antara operasi. Perbarui build Anda untuk menghilangkan perbedaan tersebut.
Jika Anda dapat mengatasi masalah penyimpanan dalam cache dan sekarang pengulangan proses menghasilkan semua hit cache, lanjutkan ke bagian berikutnya.
Jika ID tindakan Anda sama, tetapi tidak ada hit cache, berarti ada sesuatu dalam konfigurasi Anda yang mencegah penyimpanan dalam cache. Lanjutkan ke bagian ini untuk memeriksa masalah umum.
Jika tidak perlu membandingkan log eksekusi, Anda dapat menggunakan flag
--execution_log_json_file
yang dapat dibaca manusia. Metode ini tidak dapat digunakan untuk diffing yang stabil karena berisi waktu eksekusi dan tidak menjamin pengurutan.Pastikan semua tindakan dalam log eksekusi memiliki
cacheable
yang ditetapkan ke benar. Jikacacheable
tidak muncul dalam log eksekusi untuk tindakan tertentu, itu berarti aturan yang sesuai mungkin memiliki tagno-cache
dalam definisinya di fileBUILD
. Lihat kolomprogress_message
yang dapat dibaca manusia dalam log eksekusi untuk membantu menentukan asal tindakan.Jika tindakannya identik dan
cacheable
, tetapi tidak ada hit cache, mungkin command line Anda menyertakan--noremote_accept_cached
yang akan menonaktifkan pencarian cache untuk build.Jika sulit untuk mengetahui 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 Anda untuk mendapatkan versi teks log.b. Buka versi teks log dan telusuri pesan
structured_command_line
dengancommand_line_label: "canonical"
. Opsi ini akan mencantumkan semua opsi setelah diperluas.c. Telusuri
remote_accept_cached
dan periksa apakah setelan ini ditetapkan kefalse
.d. Jika
remote_accept_cached
adalahfalse
, tentukan tempatnya ditetapkan kefalse
: di command line atau di file bazelrc.
Memastikan penyimpanan dalam cache di seluruh mesin
Setelah hit cache terjadi seperti yang diharapkan di mesin yang sama, jalankan build/pengujian yang sama di mesin lain. Jika Anda mencurigai bahwa penyimpanan dalam cache tidak terjadi di seluruh komputer, lakukan hal berikut:
Lakukan sedikit modifikasi pada build Anda untuk menghindari cache yang ada.
Jalankan build di mesin pertama:
bazel clean
bazel ... build ... --execution_log_binary_file=/tmp/exec1.log
Jalankan build di mesin kedua, pastikan modifikasi dari langkah 1 disertakan:
bazel clean
bazel ... build ... --execution_log_binary_file=/tmp/exec2.log
Bandingkan log eksekusi untuk kedua eksekusi. 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 catatan semua tindakan yang dieksekusi selama build. Untuk setiap tindakan, ada elemen SpawnExec yang berisi semua informasi dari kunci tindakan. Jadi, jika log identik, kunci cache tindakan juga akan identik.
Untuk membandingkan log untuk dua build yang tidak berbagi hit cache seperti yang diharapkan, lakukan tindakan berikut:
Dapatkan log eksekusi dari setiap build dan simpan sebagai
/tmp/exec1.log
dan/tmp/exec2.log
.Download kode sumber Bazel dan buka folder Bazel menggunakan perintah di bawah. Anda memerlukan kode sumber untuk mengurai log eksekusi dengan parser execlog.
git clone https://github.com/bazelbuild/bazel.git cd bazel
Gunakan parser log eksekusi untuk mengonversi log menjadi teks. Pemanggilan berikut juga mengurutkan tindakan dalam log kedua agar cocok dengan urutan tindakan dalam 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
Gunakan teks favorit Anda yang berbeda dengan diff
/tmp/exec1.log.txt
dan/tmp/exec2.log.txt
.