Mengekstrak metrik performa build

Mungkin setiap pengguna Bazel pernah mengalami build yang lambat atau lebih lambat dari yang diharapkan. Meningkatkan performa build individual memiliki nilai khusus untuk target dengan dampak signifikan, seperti:

  1. Target developer inti yang sering diulang dan (di)bangun ulang.

  2. Library umum yang sangat bergantung pada target lain.

  3. Target perwakilan dari kelas 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 penggunaan resource. Halaman ini mencantumkan berbagai metrik yang dapat Anda kumpulkan. Memecah performa build menunjukkan cara Anda dapat 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 buffer protokol build_event_stream.proto melalui Build Event Protocol (BEP), yang 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 umumnya berguna untuk dipertimbangkan.

Perintah kueri / cquery / aquery Bazel

Bazel menyediakan 3 mode kueri yang berbeda (query, cquery, dan aquery) yang memungkinkan pengguna membuat kueri grafik target, grafik target yang dikonfigurasi, dan grafik tindakan masing-masing. Bahasa kueri menyediakan serangkaian fungsi yang dapat digunakan di berbagai mode kueri, yang memungkinkan Anda menyesuaikan kueri sesuai kebutuhan.

Profil Rekaman Aktivitas JSON

Untuk setiap pemanggilan Bazel seperti build, Bazel menulis profil rekaman aktivitas dalam format JSON. Profil rekaman aktivitas JSON dapat sangat berguna untuk memahami dengan cepat apa yang dilakukan Bazel selama pemanggilan.

Log Eksekusi

Log eksekusi dapat membantu Anda memecahkan masalah dan memperbaiki hit cache jarak jauh yang tidak ada karena perbedaan mesin dan lingkungan atau tindakan non-deterministik. Jika Anda meneruskan tanda --experimental_execution_log_spawn_metrics (tersedia dari Bazel 5.2), tanda tersebut juga akan berisi metrik proses yang mendetail, baik untuk tindakan yang dieksekusi secara lokal maupun jarak jauh. Anda dapat menggunakan metrik ini, misalnya, untuk membuat perbandingan antara performa mesin lokal dan jarak jauh atau untuk mengetahui bagian mana dari eksekusi spawn yang secara konsisten lebih lambat dari yang diharapkan (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 dieksekusi. Mulai 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 interdependensinya.

Informasi ini dapat digunakan untuk memahami tarikan yang ditambahkan oleh node di jalur kritis. Penarikan adalah jumlah waktu yang berpotensi dihemat dengan menghapus node tertentu dari grafik eksekusi.

Data ini membantu Anda memprediksi dampak perubahan pada build dan grafik tindakan sebelum Anda benar-benar melakukannya.

Tolok ukur dengan bazel-bench

Bazel bench adalah alat tolok ukur untuk project Git guna mengukur performa build dalam kasus berikut:

  • Tolok ukur project: Membandingkan dua commit git satu sama lain pada satu versi Bazel. Digunakan untuk mendeteksi regresi dalam build Anda (sering kali melalui penambahan dependensi).

  • Tolok ukur Bazel: Membandingkan dua versi Bazel satu sama lain pada satu commit git. Digunakan untuk mendeteksi regresi dalam Bazel itu sendiri (jika Anda kebetulan mengelola / membuat fork Bazel).

Benchmark memantau waktu dinding, waktu CPU, dan waktu sistem serta ukuran heap yang dipertahankan Bazel.

Sebaiknya jalankan benchmark Bazel di mesin fisik khusus yang tidak menjalankan proses lain untuk mengurangi sumber variabilitas.