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 hit cache
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. 3 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/pengujian
Anda.
Memecahkan masalah hit cache
Jika Anda tidak mendapatkan rasio cache ditemukan 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 melihat hit cache jarak jauh. Sebagai bagian dari eksekusi jarak jauh, hasil tindakan disimpan dalam cache dan proses berikutnya akan mendeteksinya.
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 uji yang Anda selidiki lagi (di mesin yang sama).
Periksa baris
INFO
untuk melihat rasio cache ditemukan. Jika Anda tidak melihat proses selainremote cache hit
daninternal
, berarti cache Anda telah diisi dan diakses dengan benar. Jika demikian, lanjutkan ke bagian berikutnya.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_compact_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. Perbarui 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 ke bagian ini untuk memeriksa masalah umum.
Pastikan
cacheable
untuk semua tindakan di log eksekusi disetel ke benar (true). Jikacacheable
tidak muncul di log eksekusi untuk tindakan berikan, berarti aturan yang sesuai mungkin memiliki tagno-cache
dalam definisinya di fileBUILD
. Lihat kolommnemonic
dantarget_label
di log eksekusi untuk membantu menentukan asal tindakan tersebut.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 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 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 parameter ini disetel kefalse
.d. Jika
remote_accept_cached
adalahfalse
, tentukan tempatnya ditetapkan kefalse
: di command line atau dalam file bazelrc.
Memastikan caching di seluruh mesin
Setelah hit cache terjadi seperti yang diharapkan di mesin yang sama, jalankan build/pengujian yang sama di mesin lain. Jika Anda menduga bahwa penyimpanan cache tidak terjadi di semua komputer, lakukan tindakan berikut:
Lakukan sedikit modifikasi pada build Anda untuk menghindari cache yang ada.
Jalankan build di komputer pertama:
bazel clean
bazel ... build ... --execution_log_compact_file=/tmp/exec1.log
Jalankan build di mesin kedua, pastikan modifikasi dari langkah 1 disertakan:
bazel clean
bazel ... build ... --execution_log_compact_file=/tmp/exec2.log
Bandingkan log eksekusi untuk kedua eksekusi. 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 tindakan yang dieksekusi selama build. Setiap data 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 dibuat dalam salah satu dari tiga format:
ringkas (--execution_log_compact_file
),
biner (--execution_log_binary_file
), atau JSON (--execution_log_json_file
).
Sebaiknya gunakan format yang ringkas karena menghasilkan file yang jauh lebih kecil dengan
overhead runtime yang sangat kecil. Petunjuk berikut berfungsi untuk semua format. Anda
juga dapat melakukan konversi di antara keduanya menggunakan alat //src/tools/execlog:converter
.
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 bangun 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:parser
untuk mengonversi log menjadi format teks yang dapat dibaca manusia. Dalam format ini, tindakan dalam log kedua diurutkan agar cocok dengan urutan dalam log pertama, sehingga memudahkan perbandingan.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 untuk membedakan
/tmp/exec1.log.txt
dan/tmp/exec2.log.txt
.