Mengekstrak metrik performa build

Laporkan masalah Lihat sumber

Mungkin setiap pengguna Bazel mengalami build yang lambat atau lebih lambat dari yang diperkirakan. Meningkatkan performa setiap build memiliki nilai tertentu untuk target yang memiliki dampak signifikan, seperti:

  1. Target developer inti yang sering diiterasi dan (di-build ulang).

  2. Library umum sangat bergantung pada target lainnya.

  3. Target representatif dari class target (misalnya aturan khusus), mendiagnosis dan memperbaiki masalah dalam satu build dapat membantu menyelesaikan masalah dalam skala yang lebih besar.

Langkah penting untuk meningkatkan performa build adalah memahami di mana resource dihabiskan. Halaman ini mencantumkan berbagai metrik yang dapat Anda kumpulkan. Menguraikan performa build akan menunjukkan cara menggunakan metrik tersebut untuk mendeteksi dan memperbaiki masalah performa build.

Ada beberapa cara utama untuk mengekstrak metrik dari build Bazel Anda, yaitu:

Protokol Peristiwa Build (BEP)

Bazel menghasilkan berbagai buffering 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 akan berguna secara umum untuk dipertimbangkan.

Perintah kueri / cquery / aquery Bazel

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

Profil Trace JSON

Untuk setiap pemanggilan Bazel yang mirip dengan build, Bazel akan menulis profil rekaman aktivitas dalam format JSON. Profil rekaman aktivitas JSON dapat sangat berguna untuk memahami dengan cepat waktu yang dihabiskan Bazel selama 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 yang mendetail, baik untuk tindakan yang dijalankan secara lokal maupun jarak jauh. Anda dapat menggunakan metrik ini, misalnya, untuk membuat perbandingan antara performa mesin lokal dan jarak jauh atau untuk mencari tahu bagian eksekusi spawn mana yang secara konsisten lebih lambat dari yang diharapkan (misalnya karena antrean).

Log Grafik Eksekusi

Meskipun profil trace JSON berisi informasi jalur penting, 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 dijalankan dan dependensinya satu per satu.

Informasi ini dapat digunakan untuk memahami tarik yang ditambahkan oleh node di jalur penting. Drag adalah jumlah waktu yang berpotensi dapat disimpan dengan menghapus node tertentu dari grafik eksekusi.

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

Tolok ukur dengan bazel-bench

Bach bench adalah alat benchmark untuk project Git guna mengukur performa build dalam kasus berikut:

  • Benchmark project: Menetapkan tolok ukur dua commit git terhadap satu sama lain dalam satu versi Bazel. Digunakan untuk mendeteksi regresi dalam build (seringnya melalui penambahan dependensi).

  • Benchmark Bazel: Menetapkan tolok ukur dua versi Bazel terhadap satu sama lain pada satu commit git. Digunakan untuk mendeteksi regresi dalam Bazel itu sendiri (jika Anda mempertahankan / mem-fork Bazel).

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

Sebaiknya Anda juga menjalankan bangku Bazel pada mesin fisik khusus yang tidak menjalankan proses lain untuk mengurangi sumber variabilitas.