Mungkin setiap pengguna Bazel pernah mengalami build yang lambat atau lebih lambat dari yang diperkirakan. Meningkatkan performa setiap build memiliki nilai tertentu untuk target dengan dampak yang signifikan, seperti:
Target developer inti yang sering diiterasi dan dibuat ulang.
Library umum yang banyak digunakan oleh target lain.
Target perwakilan dari class target (misalnya, aturan kustom), mendiagnosis dan memperbaiki masalah dalam satu build dapat membantu menyelesaikan masalah dalam skala yang lebih besar.
Langkah penting untuk meningkatkan performa build adalah memahami tempat resource dibelanjakan. Halaman ini mencantumkan berbagai metrik yang dapat Anda kumpulkan. Mengelompokkan performa build cara menggunakan metrik ini untuk mendeteksi dan memperbaiki masalah performa build.
Ada beberapa cara utama untuk mengekstrak metrik dari build Bazel Anda, yaitu:
Build Event Protocol (BEP)
Bazel menghasilkan berbagai {i>buffer<i} protokol
build_event_stream.proto
melalui Build Event Protocol (BEP), yang akan
dapat digabungkan oleh backend yang Anda tentukan. Bergantung pada kasus penggunaan,
Anda dapat memutuskan untuk menggabungkan metrik dengan berbagai cara, tetapi di sini kita akan membahas
beberapa konsep dan kolom proto yang akan berguna secara umum untuk dipertimbangkan.
Perintah kueri / kueri / kueri Bazel
Bazel menyediakan 3 mode kueri yang berbeda (query, cquery, dan aquery) yang memungkinkan pengguna mengkueri grafik target, grafik target yang dikonfigurasi, dan grafik tindakan masing-masing. Bahasa kueri menyediakan rangkaian fungsi yang dapat digunakan di berbagai mode kueri, yang memungkinkan Anda menyesuaikan kueri sesuai kebutuhan.
Profil Pelacakan JSON
Untuk setiap pemanggilan Bazel yang mirip build, Bazel akan menulis profil trace di JSON format font. Profil rekaman aktivitas JSON dapat akan sangat berguna untuk memahami dengan cepat berapa waktu Bazel menghabiskan waktu pemanggilan.
Log Eksekusi
Log eksekusi dapat membantu Anda memecahkan masalah dan memperbaiki
hit cache jarak jauh yang hilang karena perbedaan mesin dan lingkungan atau
tindakan non-deterministik. Jika Anda meneruskan flag
--experimental_execution_log_spawn_metrics
(tersedia dari Bazel 5.2), flag tersebut juga akan berisi metrik spawn mendetail, baik untuk
tindakan yang dijalankan secara lokal maupun jarak jauh. Anda dapat menggunakan metrik ini, misalnya
membuat perbandingan antara kinerja mesin lokal dan
jarak jauh atau untuk mengetahui
bagian mana dari eksekusi spawn yang secara konsisten lebih lambat dari yang diharapkan (untuk
misalnya karena antrean).
Log Grafik Eksekusi
Meskipun profil rekaman aktivitas JSON berisi informasi jalur kritis, terkadang
Anda memerlukan informasi tambahan tentang grafik dependensi tindakan yang dijalankan.
Mulai dari Bazel 6.0, Anda dapat meneruskan flag
--experimental_execution_graph_log
dan
--experimental_execution_graph_log_dep_type=all
untuk menulis log tentang
tindakan yang dieksekusi dan interdependensi-nya.
Informasi ini dapat digunakan untuk memahami tarikan yang ditambahkan oleh node pada jalur kritis. Seret adalah jumlah waktu yang berpotensi dihemat dengan menghapus {i>node<i} tertentu dari grafik eksekusi.
Data ini membantu Anda memprediksi dampak perubahan pada grafik build dan tindakan sebelum Anda benar-benar melakukannya.
Benchmark dengan bazel-bench
Bazel bench adalah alat benchmark untuk project Git guna menjalankan benchmark performa build dalam kasus berikut:
Benchmark project: Melakukan benchmark terhadap dua commit git satu sama lain pada satu versi Bazel. Digunakan untuk mendeteksi regresi dalam build Anda (sering kali melalui penambahan dependensi).
Benchmark Bazel: Melakukan benchmark terhadap dua versi Bazel satu sama lain dalam satu commit git. Digunakan untuk mendeteksi regresi dalam Bazel itu sendiri (jika Anda untuk mempertahankan / fork Bazel).
Benchmark memantau waktu berjalan, waktu CPU, dan waktu sistem serta ukuran heap retained Bazel.
Disarankan juga untuk menjalankan bench Bazel pada komputer fisik khusus yang tidak menjalankan proses lain untuk mengurangi sumber variabilitas.