Halaman ini menjelaskan cara mengoptimalkan performa build Bazel saat menjalankan Bazel berulang kali.
Status Runtime Bazel
Pemanggilan Bazel melibatkan beberapa bagian yang berinteraksi.
Antarmuka command line (CLI)
bazel
adalah alat frontend yang ditampilkan kepada pengguna dan menerima perintah dari pengguna.Alat CLI memulai server Bazel untuk setiap basis output yang berbeda. Server Bazel umumnya persisten, tetapi akan dinonaktifkan setelah beberapa waktu tidak ada aktivitas agar tidak membuang-buang resource.
Server Bazel melakukan langkah pemuatan dan analisis untuk perintah tertentu (
build
,run
,cquery
, dll.), yang membuat bagian yang diperlukan dari grafik build dalam memori. Struktur data yang dihasilkan dipertahankan di server Bazel sebagai bagian dari cache analisis.Server Bazel juga dapat melakukan eksekusi tindakan, atau dapat mengirim tindakan untuk dieksekusi dari jarak jauh jika disiapkan untuk melakukannya. Hasil eksekusi tindakan juga di-cache, yaitu di cache tindakan (atau cache eksekusi, yang dapat bersifat lokal atau jarak jauh, dan dapat dibagikan di antara server Bazel).
Hasil pemanggilan Bazel tersedia di hierarki output.
Menjalankan Bazel Secara Iteratif
Dalam alur kerja developer standar, biasanya Anda mem-build (atau menjalankan) potongan kode
berulang kali, sering kali dengan frekuensi yang sangat tinggi (misalnya, untuk menyelesaikan beberapa error
kompilasi atau menyelidiki pengujian yang gagal). Dalam situasi ini, penting bagi
pemanggilan berulang bazel
untuk memiliki overhead sekecil mungkin dibandingkan dengan
tindakan berulang yang mendasarinya (misalnya, memanggil compiler, atau menjalankan pengujian).
Dengan mempertimbangkan hal ini, mari kita lihat kembali status runtime Bazel:
Cache analisis adalah bagian data yang penting. Sejumlah besar waktu dapat dihabiskan hanya pada fase pemuatan dan analisis cold run (yaitu, run tepat setelah server Bazel dimulai atau saat cache analisis dihapus). Untuk satu cold build yang berhasil (misalnya, untuk rilis produksi), biaya ini dapat ditanggung, tetapi untuk mem-build target yang sama berulang kali, biaya ini harus diamortisasi dan tidak diulang pada setiap pemanggilan.
Cache analisis agak tidak stabil. Pertama, cache adalah bagian dari status
dalam proses server Bazel, sehingga kehilangan server akan kehilangan cache. Namun, cache
juga dibuat tidak valid dengan sangat mudah: misalnya, banyak flag command line bazel
menyebabkan cache dihapus. Hal ini karena banyak flag yang memengaruhi grafik
build (misalnya karena
atribut yang dapat dikonfigurasi). Beberapa perubahan flag
juga dapat menyebabkan server Bazel dimulai ulang (misalnya, mengubah
opsi startup).
Cache eksekusi yang baik juga berharga untuk performa build. Cache eksekusi dapat disimpan secara lokal di disk, atau secara jarak jauh. Cache dapat dibagikan di antara server Bazel, dan juga di antara developer.
Menghindari penghapusan cache analisis
Bazel akan mencetak peringatan jika cache analisis dihapus atau server dimulai ulang. Salah satu dari hal berikut harus dihindari selama penggunaan berulang:
Perhatikan perubahan tanda
bazel
di tengah alur kerja iteratif. Misalnya, menggabungkanbazel build -c opt
denganbazel cquery
menyebabkan setiap perintah menghapus cache analisis dari perintah lainnya. Secara umum, coba gunakan kumpulan flag tetap selama durasi alur kerja tertentu.Jika server Bazel hilang, cache analisis juga akan hilang. Server Bazel memiliki waktu tidak ada aktivitas yang dapat dikonfigurasi, lalu server akan dinonaktifkan. Anda dapat mengonfigurasi waktu ini melalui file bazelrc agar sesuai dengan kebutuhan Anda. Server juga dimulai ulang saat flag startup berubah, jadi, sekali lagi, hindari mengubah flag tersebut jika memungkinkan.
Berhati-hatilah karena server Bazel akan dihentikan jika Anda menekan Ctrl-C berulang kali saat Bazel berjalan. Anda mungkin ingin menghemat waktu dengan mengganggu build yang sedang berjalan dan tidak lagi diperlukan, tetapi cukup tekan Ctrl-C sekali untuk meminta penghentian yang baik dari pemanggilan saat ini.
Jika ingin menggunakan beberapa kumpulan flag dari ruang kerja yang sama, Anda dapat menggunakan beberapa basis output yang berbeda, yang diaktifkan dengan flag
--output_base
. Setiap basis output mendapatkan server Bazel-nya sendiri.