Profil rekaman aktivitas JSON dapat sangat berguna untuk memahami waktu yang dihabiskan Bazel selama pemanggilan.
Secara default, untuk semua perintah seperti build dan membuat kueri agar Bazel menulis profil tersebut ke command.profile.gz
. Anda dapat mengonfigurasi apakah profil ditulis dengan flag --generate_json_trace_profile
, dan lokasi penulisannya dengan flag --profile
. Lokasi yang diakhiri dengan .gz
dikompresi dengan GZIP. Gunakan flag --experimental_announce_profile_path
untuk mencetak jalur ke file ini ke log.
Alat
Anda dapat memuat profil ini ke dalam chrome://tracing
atau menganalisis dan
melanjutkan proses dengan alat lainnya.
chrome://tracing
Untuk memvisualisasikan profil, buka chrome://tracing
di tab browser Chrome,
klik "Load" dan pilih file profil (berpotensi dikompresi). Untuk hasil
yang lebih mendetail, klik kotak di sudut kiri bawah.
Contoh profil:
Gambar 1. Contoh profil.
Anda dapat menggunakan kontrol keyboard ini untuk bernavigasi:
- 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 menggunakana
/d
untuk berpindah ke kiri/kanan. - Tekan
3
untuk mode "zoom". Lalu, tarik mouse untuk memperbesar. Anda juga dapat menggunakanw
/s
untuk memperbesar/memperkecil. - Tekan
4
untuk mode "pengaturan waktu" tempat Anda dapat mengukur jarak antara dua peristiwa. - Tekan
?
untuk mempelajari semua kontrol.
bazel analyze-profile
Subperintah Bazel analyze-profile
menggunakan format profil dan mencetak statistik kumulatif untuk
berbagai jenis tugas untuk setiap fase build dan analisis jalur penting.
Misalnya, perintah
$ bazel build --profile=/tmp/profile.gz //path/to:target
...
$ bazel analyze-profile /tmp/profile.gz
dapat menghasilkan output formulir ini:
INFO: Profile created on Tue Jun 16 08:59:40 CEST 2020, build ID: 0589419c-738b-4676-a374-18f7bbc7ac23, output base: /home/johndoe/.cache/bazel/_bazel_johndoe/d8eb7a85967b22409442664d380222c0
=== PHASE SUMMARY INFORMATION ===
Total launch phase time 1.070 s 12.95%
Total init phase time 0.299 s 3.62%
Total loading phase time 0.878 s 10.64%
Total analysis phase time 1.319 s 15.98%
Total preparation phase time 0.047 s 0.57%
Total execution phase time 4.629 s 56.05%
Total finish phase time 0.014 s 0.18%
------------------------------------------------
Total run time 8.260 s 100.00%
Critical path (4.245 s):
Time Percentage Description
8.85 ms 0.21% _Ccompiler_Udeps for @local_config_cc// compiler_deps
3.839 s 90.44% action 'Compiling external/com_google_protobuf/src/google/protobuf/compiler/php/php_generator.cc [for host]'
270 ms 6.36% action 'Linking external/com_google_protobuf/protoc [for host]'
0.25 ms 0.01% runfiles for @com_google_protobuf// protoc
126 ms 2.97% action 'ProtoCompile external/com_google_protobuf/python/google/protobuf/compiler/plugin_pb2.py'
0.96 ms 0.02% runfiles for //tools/aquery_differ aquery_differ
Penganalisis Pemanggilan Bazel
Bazel Invocation Analyzer open source menggunakan format profil dan mencetak saran tentang cara meningkatkan performa build. Analisis ini dapat dilakukan menggunakan CLI 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 yang sesuai, tetapi beberapa baris khusus juga disertakan.
Baris khusus yang disertakan bergantung pada versi Bazel yang dipanggil saat profil dibuat, dan dapat disesuaikan dengan flag yang berbeda.
Gambar 1 menunjukkan profil yang dibuat dengan Bazel v5.3.1 dan menyertakan baris berikut:
action count
: Menampilkan jumlah tindakan serentak yang berlangsung. Klik untuk melihat nilai sebenarnya. Harus mencapai 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 sibuk 100%).Critical Path
: Menampilkan satu blok untuk setiap tindakan di jalur penting.Main Thread
: Thread utama Bazel. Berguna untuk mendapatkan gambaran tingkat tinggi tentang apa yang dilakukan Bazel, misalnya "Launch Blaze", "evaTargetPatterns", dan "runAnalysisPhase".Garbage Collector
: Menampilkan jeda Pengumpulan Sampah minor dan utama (GC).
Masalah performa umum
Saat menganalisis profil performa, cari:
- Fase analisis lebih lambat dari
runAnalysisPhase
(yang diharapkan), terutama pada build inkremental. Hal ini dapat menjadi tanda implementasi aturan yang buruk, misalnya yang membuat depset menjadi rata. Pemuatan paket dapat berjalan lambat jika jumlah target berlebihan, makro kompleks, atau glob berulang. - Setiap tindakan lambat, terutama yang berada di jalur penting. Anda dapat
membagi tindakan besar menjadi beberapa tindakan yang lebih kecil atau mengurangi
kumpulan dependensi (transitif) untuk mempercepatnya. Periksa juga non-
PROCESS_TIME
tinggi yang tidak biasa (sepertiREMOTE_SETUP
atauFETCH
). - Bottleneck, yang merupakan sejumlah kecil thread sedang sibuk sementara yang lain menganggur / menunggu hasilnya (lihat sekitar 22 dan 29 di Gambar 1). Pengoptimalan opsi ini kemungkinan besar akan memerlukan penerapan implementasi 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 level teratas berisi metadata (otherData
) dan data pelacakan aktual (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 rekaman aktivitas diberikan dalam
mikrodetik. Kategori (cat
) adalah salah satu nilai enum ProfilerTask
.
Perhatikan bahwa beberapa peristiwa akan digabungkan jika sangat singkat dan saling berdekatan; teruskan --noslim_json_profile
jika Anda tidak ingin penggabungan peristiwa.
Lihat juga Spesifikasi Format Peristiwa Chrome Trace.