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 eksekusi 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 dieksekusi dari jarak jauh, linux-sandbox untuk tindakan yang dieksekusi 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 cache jarak jauh ditemukan, dan 2 tindakan tidak memiliki cache ditemukan dan dieksekusi dari jarak jauh. Bagian internal 3 dapat diabaikan.
Biasanya tindakan internal kecil, seperti membuat link simbolis. Cache lokal ditemukan tidak disertakan dalam ringkasan ini. Jika Anda mendapatkan 0 proses (atau angka yang lebih rendah dari yang diharapkan), jalankan bazel clean, lalu perintah build/pengujian.
Memecahkan masalah cache ditemukan
Jika Anda tidak mendapatkan rasio cache ditemukan yang diharapkan, lakukan hal berikut:
Memastikan menjalankan kembali perintah build/pengujian yang sama akan menghasilkan cache ditemukan
Jalankan build dan/atau pengujian yang diharapkan akan mengisi cache. Saat pertama kali build baru dijalankan pada stack tertentu, Anda tidak akan mendapatkan cache jarak jauh ditemukan. Sebagai bagian dari eksekusi jarak jauh, hasil tindakan disimpan dalam cache dan eksekusi berikutnya akan mengambilnya.
Jalankan
bazel clean. Perintah ini membersihkan cache lokal, yang memungkinkan Anda menyelidiki cache jarak jauh ditemukan tanpa hasil yang ditutupi oleh cache lokal ditemukan.Jalankan kembali build dan pengujian yang Anda selidiki (di mesin yang sama).
Periksa baris
INFOuntuk rasio cache ditemukan. Jika Anda tidak melihat proses kecualiremote cache hitdaninternal, berarti cache Anda diisi dan diakses dengan benar. Dalam hal ini, lewati ke bagian berikutnya.Kemungkinan sumber perbedaan adalah sesuatu yang tidak hermetik dalam build yang menyebabkan tindakan menerima kunci tindakan yang berbeda di kedua eksekusi. Untuk menemukan tindakan tersebut, lakukan hal berikut:
a. Jalankan kembali build atau pengujian yang dimaksud untuk mendapatkan log eksekusi:
bazel cleanbazel --optional-flags build //your:target --execution_log_compact_file=/tmp/exec1.logb. Bandingkan log eksekusi antara kedua eksekusi. Pastikan tindakan tersebut identik di kedua file log. Perbedaan memberikan petunjuk tentang perubahan yang terjadi antara eksekusi. Perbarui build untuk menghilangkan perbedaan tersebut.
Jika Anda dapat menyelesaikan masalah caching dan eksekusi berulang kini menghasilkan semua cache ditemukan, lewati ke bagian berikutnya.
Jika ID tindakan Anda identik tetapi tidak ada cache ditemukan, berarti ada sesuatu dalam konfigurasi yang mencegah caching. Lanjutkan dengan bagian ini untuk memeriksa masalah umum.
Pastikan semua tindakan dalam log eksekusi memiliki
cacheableyang ditetapkan ke benar (true). Jikacacheabletidak muncul dalam log eksekusi untuk tindakan tertentu, berarti aturan yang sesuai mungkin memiliki tagno-cachedalam definisinya di fileBUILD. Lihat kolommnemonicdantarget_labeldi log eksekusi untuk membantu menentukan asal tindakan.Jika tindakan identik dan
cacheable, tetapi tidak ada cache ditemukan, kemungkinan command line Anda menyertakan--noremote_accept_cachedyang akan menonaktifkan pencarian cache untuk build.a. Tambahkan
--build_event_text_file=/tmp/bep.txtke perintah Bazel untuk mendapatkan versi teks log.b. Buka versi teks log dan cari pesan
structured_command_linedengancommand_line_label: "canonical". Semua opsi akan dicantumkan setelah ekspansi.c. Cari
remote_accept_cacheddan periksa apakah ditetapkan kefalse.d. Jika
remote_accept_cachedadalahfalse, tentukan tempatnya ditetapkan kefalse: di command line atau dalam file bazelrc.
Memastikan caching di seluruh mesin
Setelah cache ditemukan terjadi seperti yang diharapkan di mesin yang sama, jalankan build/pengujian yang sama di mesin lain. Jika Anda menduga bahwa caching tidak terjadi di seluruh mesin, lakukan hal berikut:
Buat modifikasi kecil pada build untuk menghindari cache yang ada.
Jalankan build di mesin pertama:
bazel cleanbazel ... build ... --execution_log_compact_file=/tmp/exec1.logJalankan build di mesin kedua, pastikan modifikasi dari langkah 1 disertakan:
bazel cleanbazel ... build ... --execution_log_compact_file=/tmp/exec2.logBandingkan log eksekusi untuk kedua eksekusi. Jika log tidak identik, selidiki konfigurasi build Anda untuk mengetahui perbedaan serta properti dari lingkungan host yang bocor ke salah satu build.
Membandingkan log eksekusi
Log eksekusi berisi catatan tindakan yang dieksekusi selama build. Setiap catatan menjelaskan input (tidak hanya file, tetapi juga argumen command line, variabel lingkungan, dll.) dan output tindakan. Dengan demikian, pemeriksaan log dapat mengungkapkan alasan tindakan dieksekusi ulang.
Log eksekusi dapat dihasilkan dalam salah satu dari tiga format: ringkas (--execution_log_compact_file), biner (--execution_log_binary_file), atau JSON (--execution_log_json_file). Format ringkas direkomendasikan, karena menghasilkan file yang jauh lebih kecil dengan overhead runtime yang sangat kecil. Petunjuk berikut berfungsi untuk format apa pun. Anda juga dapat mengonversi di antara format tersebut menggunakan alat //src/tools/execlog:converter.
Untuk membandingkan log untuk dua build yang tidak berbagi cache ditemukan seperti yang diharapkan, lakukan hal berikut:
Dapatkan log eksekusi dari setiap build dan simpan sebagai
/tmp/exec1.logdan/tmp/exec2.log.Download kode sumber Bazel dan buat alat
//src/tools/execlog:parser:git clone https://github.com/bazelbuild/bazel.git cd bazel bazel build //src/tools/execlog:parser
Gunakan alat
//src/tools/execlog:parseruntuk mengonversi log ke format teks yang mudah dibaca. Dalam format ini, tindakan dalam log kedua diurutkan agar sesuai dengan urutan dalam log pertama, sehingga perbandingan menjadi lebih mudah.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.txtGunakan pembanding teks favorit Anda untuk membandingkan
/tmp/exec1.log.txtdan/tmp/exec2.log.txt.