JSON izleme profili, Bazel'in ne kadar harcama yaptığını hızlı bir şekilde anlamak için oldukça faydalı olabilir. sırasında açık kalır.
Varsayılan olarak, tüm derleme benzeri komutlar ve sorgular için Bazel,
command.profile.gz
, çıktı tabanında bulunur. Bir profilin, varsayılan olarak
şununla yazılmıştır:
--generate_json_trace_profile
ve içeriğin işaretlendiği yeri
--profile
işareti. .gz
ile biten konumlar
GZIP ile sıkıştırıldı.
Araçlar
Bu profili chrome://tracing
hizmetine yükleyebilir veya web sitenizin
diğer araçlarla süreç boyunca işleyin.
chrome://tracing
Profili görselleştirmek için Chrome tarayıcı sekmesinde chrome://tracing
uygulamasını açın,
"Yükle"yi tıklayın ve (potansiyel olarak sıkıştırılmış) profil dosyasını seçin. Daha fazla
ayrıntılı sonuçları görmek için sol alt köşedeki kutuları tıklayın.
Örnek profil:
Şekil 1. Örnek profil.
Gezinmek için şu klavye denetimlerini kullanabilirsiniz:
- "Seç" için
1
tuşlarına basın yatırım yapmanız önemlidir. Bu modda, tıklayın (sol alt köşeye bakın). Özet ve toplu istatistikler almak için birden fazla etkinlik seçin. - "Kaydır" için
2
tuşlarına basın yatırım yapmanız önemlidir. Ardından görünümü hareket ettirmek için fareyi sürükleyin. Siz sağa/sola gitmek içina
/d
tuşlarını da kullanabilirsiniz. - "Yakınlaştırma" için
3
tuşlarına basın yatırım yapmanız önemlidir. Ardından, yakınlaştırmak için fareyi sürükleyin. Şunları yapabilirsiniz: yakınlaştırmak/uzaklaştırmak içinw
/s
tuşlarını da kullanın. - "Zamanlama" için
4
tuşlarına basın Mesafeyi ölçebileceğiniz bir mod iki etkinlik vardır. - Tüm kontroller hakkında bilgi edinmek için
?
tuşuna basın.
bazel analyze-profile
Bazel alt komutu analyze-profile
bir profil biçimi kullanır ve şunun için kümülatif istatistikleri yazdırır:
her yapı aşaması için farklı görev türleri ve kritik yolun analizi.
Örneğin, komutlar
$ bazel build --profile=/tmp/profile.gz //path/to:target
...
$ bazel analyze-profile /tmp/profile.gz
şu biçimde çıktılar verebilir:
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
Bazel Çağrı Analiz Aracı
Açık kaynak Bazel Çağrı Analiz Aracı Kullanıcı bir profil biçimi kullanır ve bunu iyileştirmek için öneriler yazdırır. derlemenin performansı. Bu analiz, KSA veya KSA kullanılarak yapılabilir. https://analyzer.engflow.com.
jq
jq
, JSON verileri için sed
gibidir. Tüm öğeleri ayıklamak için örnek jq
kullanımı
yerel işlem yürütme sırasında korumalı alan oluşturma adımının süreleri:
$ 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
[...]
Profil bilgileri
Profil birden fazla satır içeriyor. Genellikle satırların büyük bir kısmı Bazel'i temsil eder ancak bazı özel satırlar da dahil edilir.
Dahil edilen özel satırlar, profili oluşturulmuş olup farklı işaretler ile özelleştirilebilir.
Şekil 1'de Bazel v5.3.1 ile oluşturulmuş bir profil gösterilmiştir ve aşağıdaki satırları içerir:
action count
: Yayında olan eşzamanlı işlem sayısını gösterir. Sonraki slayta geçin tıklayın. En fazla şu değere sahip olmalıdır:--jobs
temiz inşa eder.CPU usage (Bazel)
: Derlemenin her saniyesi için toplamda Bazel tarafından kullanılan CPU (1 değeri, bir çekirdeğin% 100 meşgul olduğunu gösterir).Critical Path
: Kritik yoldaki her işlem için bir blok görüntüler.Main Thread
: Bazel'in ana ileti dizisi. Müşteriyi genel hatlarıyla tanımanıza yardımcı olur. örnek olarak "Launch Blaze", "assessTargetPatterns", ve "runAnalysisPhase" olarak adlandırılır.Garbage Collector
: Küçük ve büyük çöp toplama (GC) verilerini gösterir duraklar.
Sık karşılaşılan performans sorunları
Performans profillerini analiz ederken şunlara dikkat edin:
- Beklenenden daha yavaş analiz aşaması (
runAnalysisPhase
), özellikle iyi bir fırsattır. Bu durum, normal koşullarda tek bir örnek verelim. Paketin yüklenmesi aşırı miktarda hedef, karmaşık makrolar veya özyinelemeli glob'lar. - Bağımsız yavaş işlemler, özellikle de kritik yoldakiler. Projenin
küçük işlemleri birden fazla küçük işleme bölmek veya
bir dizi (geçişli) bağımlılıktan oluşur. Ayrıca, olağandışı bir
PROCESS_TIME
olmayan yüksek değer (REMOTE_SETUP
veyaFETCH
gibi). - Performans sorunları; az sayıda ileti dizisi meşgulken diğer tüm ileti dizileri boşta kalma / sonucu bekleme (Şekil 1'deki yaklaşık 22 sn ve 29 saniyeye bakın). Bunu optimize etmek büyük olasılıkla kural uygulamalarına dokunmayı gerektirecektir veya Bazel'in kendisini tanıtacağını düşünüyor. Bu durum, olağanüstü miktarda GC var.
Profil dosya biçimi
Üst düzey nesne, meta verileri (otherData
) ve gerçek izleme verilerini içerir
(traceEvents
). Meta veri, çağrı kimliği gibi ek bilgiler içerir
ve Bazel çağrı tarihini belirtin.
Örnek:
{
"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},
]
}
İzleme etkinliklerindeki zaman damgaları (ts
) ve süreler (dur
)
mikrosaniyedir. Kategori (cat
), ProfilerTask
enum değerlerinden biri.
Çok kısa ve çok yakın olan bazı etkinliklerin birleştirildiğini unutmayın.
birbiri ile; bilet
--noslim_profile
etkinlik birleştirmeyi önlemek istiyorsanız.
Ayrıca bkz. Chrome İzleme Etkinlik Biçimi Spesifikasyonu.