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 efektif menggunakan {i>cache<i} jarak jauh.
Memeriksa rasio cache ditemukan
Pada output standar dari proses Bazel Anda, lihat baris INFO
yang mencantumkan
yang kurang lebih berkaitan dengan tindakan Bazel. Baris tersebut menjelaskan
tempat tindakan dijalankan. Cari label remote
, yang menunjukkan tindakan
dijalankan dari jarak jauh, linux-sandbox
untuk tindakan yang dijalankan di sandbox lokal,
dan nilai lain 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
cache ditemukan dan dieksekusi dari jarak jauh. Tiga 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 build/pengujian Anda
perintah.
Memecahkan masalah hit cache
Jika Anda tidak mendapatkan rasio cache ditemukan yang diharapkan, lakukan hal berikut:
Memastikan menjalankan kembali perintah build/test yang sama akan menghasilkan hit cache
Jalankan build dan/atau pengujian yang Anda harapkan untuk mengisi cache. Tujuan pertama kali build baru dijalankan pada stack tertentu, Anda mungkin tidak akan melakukan cache ditemukan. Sebagai bagian dari eksekusi jarak jauh, hasil tindakan disimpan di {i>cache<i} dan proses selanjutnya akan mendeteksinya.
Jalankan
bazel clean
. Perintah ini membersihkan {i> cache<i} lokal Anda, yang memungkinkan Anda untuk menyelidiki hit cache jarak jauh tanpa hasilnya tertutup oleh cache lokal.Jalankan build dan pengujian yang Anda selidiki lagi (di mesin yang sama).
Periksa baris
INFO
untuk melihat rasio cache ditemukan. Jika Anda tidak melihat proses kecualiremote cache hit
daninternal
, berarti cache Anda diisi dan diakses dengan benar. Jika demikian, lanjutkan ke bagian berikutnya.Kemungkinan sumber perbedaan adalah sesuatu yang non-hermetik dalam build yang menyebabkan tindakan untuk menerima kunci tindakan yang berbeda di kedua proses 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_compact_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 menyelesaikan masalah penyimpanan dalam cache dan setelah operasi berulang, menghasilkan semua klik cache, lanjutkan ke bagian berikutnya.
Jika ID tindakan Anda identik tetapi tidak ada cache ditemukan, di konfigurasi Anda akan mencegah penyimpanan cache. Lanjutkan dengan bagian ini untuk memeriksa masalah yang umum terjadi.
Pastikan
cacheable
untuk semua tindakan di log eksekusi disetel ke benar (true). Jikacacheable
tidak muncul dalam log eksekusi untuk tindakan tertentu, artinya aturan yang sesuai mungkin memiliki tagno-cache
dalam definisinya di fileBUILD
. Lihat kolommnemonic
dantarget_label
dalam log eksekusi untuk membantu menentukan asal tindakan tersebut.Jika tindakan identik dan
cacheable
tetapi tidak ada cache ditemukan, mungkin command line Anda menyertakan--noremote_accept_cached
yang akan menonaktifkan pencarian cache untuk sebuah 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 log versi teks.b. Buka versi teks log dan telusuri pesan
structured_command_line
dengancommand_line_label: "canonical"
. Tindakan ini akan mencantumkan semua opsi setelah perluasan.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 di file bazelrc.
Memastikan caching di seluruh mesin
Setelah cache ditemukan terjadi seperti yang diharapkan di komputer yang sama, jalankan build/pengujian yang sama pada komputer yang berbeda. 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 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
Membandingkan log eksekusi untuk keduanya yang dijalankan. Jika log tidak identik, selidiki konfigurasi build Anda untuk perbedaan serta kebocoran properti dari lingkungan {i>host<i} ke salah satu build.
Membandingkan log eksekusi
Log eksekusi berisi kumpulan data tindakan yang dieksekusi selama build. Setiap kumpulan data menjelaskan kedua input tersebut (tidak hanya file, tetapi juga command line argumen, variabel lingkungan, dll.) dan output tindakan. Dengan demikian, pemeriksaan log dapat mengungkapkan mengapa suatu tindakan dijalankan kembali.
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
).
Format ringkas direkomendasikan karena menghasilkan file yang jauh lebih kecil dengan
overhead runtime yang sangat sedikit. Petunjuk berikut berfungsi untuk semua format. Anda
juga dapat mengonversi 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 build 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 adalah diurutkan agar sesuai dengan urutan di log pertama, membuat perbandingan 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.txt
Gunakan teks favorit Anda yang berbeda untuk perbedaan
/tmp/exec1.log.txt
dan/tmp/exec2.log.txt
.