Profil Rekaman Aktivitas JSON

Profil trace JSON dapat sangat berguna untuk memahami dengan cepat hal yang dilakukan Bazel selama pemanggilan.

Secara default, untuk semua perintah dan kueri seperti build, Bazel menulis profil ke basis output bernama command-$INVOCATION_ID.profile.gz, dengan $INVOCATION_ID adalah ID pemanggilan perintah. Bazel juga membuat symlink bernama command.profile.gz di basis output yang mengarah ke profil perintah terbaru. Anda dapat mengonfigurasi apakah profil ditulis dengan flag --generate_json_trace_profile, dan lokasi tempat profil ditulis dengan flag --profile. Lokasi yang diakhiri dengan .gz dikompresi dengan GZIP. Secara default, Bazel menyimpan 5 profil terakhir, yang dapat dikonfigurasi dengan --profiles_to_retain, di basis output untuk analisis pasca-build. Meneruskan jalur profil secara eksplisit dengan --profile akan menonaktifkan pengumpulan sampah otomatis.

Alat

Anda dapat memuat profil ini ke chrome://tracing atau menganalisis dan memprosesnya pasca-proses dengan alat lain.

chrome://tracing

Untuk memvisualisasikan profil, buka chrome://tracing di tab browser Chrome, klik "Load", dan pilih file profil (yang mungkin dikompresi). Untuk hasil yang lebih mendetail, klik kotak di sudut kiri bawah.

Contoh profil:

Contoh
profil Gambar 1. Contoh profil.

Anda dapat menggunakan kontrol keyboard ini untuk melakukan navigasi:

  • Tekan 1 untuk mode "pilih". Dalam mode ini, Anda dapat memilih kotak tertentu untuk memeriksa detail peristiwa (lihat sudut kiri bawah). Pilih beberapa peristiwa untuk mendapatkan ringkasan dan statistik gabungan.
  • Tekan 2 untuk mode "geser". Kemudian, tarik mouse untuk memindahkan tampilan. Anda juga dapat menggunakan a/d untuk bergerak ke kiri/kanan.
  • Tekan 3 untuk mode "zoom". Kemudian, tarik mouse untuk melakukan zoom. Anda juga dapat menggunakan w/s untuk memperbesar/memperkecil.
  • Tekan 4 untuk mode "waktu" tempat Anda dapat mengukur jarak antara dua peristiwa.
  • Tekan ? untuk mempelajari semua kontrol.

Bazel Invocation Analyzer

Bazel Invocation Analyzer open source menggunakan format profil dan mencetak saran tentang cara meningkatkan performa build. Analisis ini dapat dilakukan menggunakan CLI-nya atau di https://analyzer.engflow.com.

jq

jq seperti sed untuk data JSON. Contoh penggunaan jq untuk mengekstrak semua durasi langkah pembuatan sandbox dalam eksekusi tindakan lokal:

$ zcat $(../bazel-6.0.0rc1-linux-x86_64 info output_base)/command.profile.gz | jq '.traceEvents | .[] | select(.name == "sandbox.createFileSystem") | .dur'
6378
7247
11850
13756
6555
7445
8487
15520
[...]

Informasi profil

Profil berisi beberapa baris. Biasanya, sebagian besar baris mewakili thread Bazel dan peristiwa terkaitnya, tetapi beberapa baris khusus juga disertakan.

Baris khusus yang disertakan bergantung pada versi Bazel yang dipanggil saat profil dibuat, dan dapat disesuaikan dengan berbagai flag.

Gambar 1 menunjukkan profil yang dibuat dengan Bazel v5.3.1 dan menyertakan baris berikut:

  • action count: Menampilkan jumlah tindakan serentak yang sedang berlangsung. Klik untuk melihat nilai sebenarnya. Harus sesuai dengan nilai --jobs dalam build bersih.
  • CPU usage (Bazel): Untuk setiap detik build, menampilkan jumlah CPU yang digunakan oleh Bazel (nilai 1 sama dengan satu core yang 100% sibuk).
  • Critical Path: Menampilkan satu blok untuk setiap tindakan di jalur penting.
  • Main Thread: Thread utama Bazel. Berguna untuk mendapatkan gambaran tingkat tinggi tentang aktivitas Bazel, misalnya "Launch Blaze", "evaluateTargetPatterns", dan "runAnalysisPhase".
  • Garbage Collector: Menampilkan jeda Pengumpulan Sampah (GC) kecil dan besar.

Masalah performa umum

Saat menganalisis profil performa, cari:

  • Fase analisis (runAnalysisPhase) yang lebih lambat dari yang diharapkan, terutama pada build inkremental. Hal ini dapat menjadi tanda penerapan aturan yang buruk, misalnya yang meratakan depsets. Pemuatan paket dapat menjadi lambat karena jumlah target yang berlebihan, makro yang kompleks, atau glob rekursif.
  • Tindakan individual yang lambat, terutama yang berada di jalur penting. Mungkin Anda dapat membagi tindakan besar menjadi beberapa tindakan yang lebih kecil atau mengurangi kumpulan dependensi (transitif) untuk mempercepatnya. Periksa juga PROCESS_TIME non-tinggi yang tidak biasa (seperti REMOTE_SETUP atau FETCH).
  • Hambatan, yaitu sejumlah kecil thread sibuk sementara semua thread lainnya tidak aktif / menunggu hasil (lihat sekitar 22 detik dan 29 detik di Gambar 1). Untuk mengoptimalkan hal ini, kemungkinan besar Anda harus mengubah penerapan aturan atau Bazel itu sendiri untuk memperkenalkan lebih banyak paralelisme. Hal ini juga dapat terjadi jika ada jumlah GC yang tidak biasa.

Format file profil

Objek tingkat atas berisi metadata (otherData) dan data pelacakan sebenarnya (traceEvents). Metadata berisi info tambahan, misalnya ID pemanggilan dan tanggal pemanggilan Bazel.

Contoh:

{
  "otherData": {
    "build_id": "101bff9a-7243-4c1a-8503-9dc6ae4c3b05",
    "date": "Wed Oct 26 08:22:35 CEST 2022",
    "profile_finish_ts": "1677666095162000",
    "output_base": "/usr/local/google/_bazel_johndoe/573d4be77eaa72b91a3dfaa497bf8cd0"
  },
  "traceEvents": [
    {"name":"thread_name","ph":"M","pid":1,"tid":0,"args":{"name":"Critical Path"}},
    ...
    {"cat":"build phase marker","name":"Launch Blaze","ph":"X","ts":-1306000,"dur":1306000,"pid":1,"tid":21},
    ...
    {"cat":"package creation","name":"foo","ph":"X","ts":2685358,"dur":784,"pid":1,"tid":246},
    ...
    {"name":"thread_name","ph":"M","pid":1,"tid":11,"args":{"name":"Garbage Collector"}},
    {"cat":"gc notification","name":"minor GC","ph":"X","ts":825986,"dur":11000,"pid":1,"tid":11},
    ...
    {"cat":"action processing","name":"Compiling foo/bar.c","ph":"X","ts":54413389,"dur":357594,"pid":1,"args":{"mnemonic":"CppCompile"},"tid":341},
 ]
}

Stempel waktu (ts) dan durasi (dur) dalam peristiwa pelacakan diberikan dalam mikrodetik. Kategori (cat) adalah salah satu nilai enum ProfilerTask. Perhatikan bahwa beberapa peristiwa digabungkan jika sangat singkat dan berdekatan satu sama lain; teruskan --noslim_profile jika Anda ingin mencegah penggabungan peristiwa.

Lihat juga Spesifikasi Format Peristiwa Pelacakan Chrome.