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 front-end yang menghadap pengguna dan menerima perintah dari pengguna.Alat CLI memulai server Bazel untuk setiap dasar output yang berbeda. Server Bazel umumnya persisten, tetapi akan dimatikan setelah beberapa waktu tidak ada aktivitas agar tidak membuang-buang resource.
Server Bazel melakukan langkah-langkah pemuatan dan analisis untuk perintah tertentu (
build
,run
,cquery
, dll.), yang di dalamnya server membangun bagian-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 mengirimkan tindakan untuk eksekusi jarak jauh jika disiapkan untuk melakukannya. Hasil eksekusi tindakan juga di-cache, yaitu di cache tindakan (atau cache eksekusi, yang dapat berupa lokal atau jarak jauh, dan dapat dibagikan di antara server Bazel).
Hasil pemanggilan Bazel tersedia di struktur output.
Menjalankan Bazel Secara Berulang
Dalam alur kerja developer yang umum, biasanya sepotong kode dibuat (atau dijalankan) berulang kali, sering kali dengan frekuensi yang sangat tinggi (misalnya, untuk menyelesaikan beberapa kesalahan kompilasi atau menyelidiki pengujian yang gagal). Dalam situasi ini, penting agar
pemanggilan bazel
berulang memiliki overhead sekecil mungkin dibandingkan dengan
tindakan berulang yang mendasarinya (misalnya, memanggil compiler, atau menjalankan pengujian).
Dengan mempertimbangkan hal ini, kita akan melihat kembali status runtime Bazel:
Cache analisis adalah bagian penting dari data. Waktu yang signifikan dapat dihabiskan hanya untuk fase pemuatan dan analisis cold run (yaitu, run tepat setelah server Bazel dimulai atau saat cache analisis dibuang). Untuk satu build dingin yang berhasil (misalnya, untuk rilis produksi), biaya ini dapat ditanggung, tetapi untuk membangun target yang sama berulang kali, penting agar biaya ini diamortisasi dan tidak diulang pada setiap pemanggilan.
Cache analisis cukup tidak stabil. Pertama-tama, ini adalah bagian dari status
dalam proses server Bazel, jadi jika server hilang, cache juga akan hilang. Namun, cache juga dibatalkan dengan sangat mudah: misalnya, banyak tanda command line bazel
menyebabkan cache dibuang. Hal ini karena banyak tanda 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 dari jarak jauh. Cache dapat dibagikan di antara server Bazel, dan bahkan di antara developer.
Menghindari penghapusan cache analisis
Bazel akan mencetak peringatan jika cache analisis dibuang atau server dimulai ulang. Keduanya harus dihindari selama penggunaan berulang:
Berhati-hatilah saat mengubah tanda
bazel
di tengah alur kerja iteratif. Misalnya, mencampurbazel build -c opt
denganbazel cquery
akan menyebabkan setiap perintah menghapus cache analisis 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, setelah itu server akan dimatikan. 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.
Perhatikan bahwa server Bazel akan dihentikan jika Anda menekan Ctrl-C berulang kali saat Bazel sedang berjalan. Anda mungkin tergoda untuk menghemat waktu dengan menghentikan build yang sedang berjalan dan tidak lagi diperlukan, tetapi tekan Ctrl-C hanya sekali untuk meminta penghentian yang benar dari pemanggilan saat ini.
Jika ingin menggunakan beberapa set flag dari ruang kerja yang sama, Anda dapat menggunakan beberapa basis output yang berbeda, yang diubah dengan flag
--output_base
. Setiap dasar output mendapatkan server Bazel-nya sendiri.
Untuk menjadikan kondisi ini sebagai error, bukan peringatan, Anda dapat menggunakan
flag --noallow_analysis_cache_discard
(diperkenalkan di Bazel 6.4.0)