JSON İzleme Profili

. Sorun bildirin Kaynağı göster Gece · 7,3 · 7,2 · 7,1 · 7,0 · 6,5

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 Bir profilin --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ı. Bayrağı kullan --experimental_announce_profile_path (bu dosyanın yolunu günlüğe yazdırmak için) tıklayın.

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:

Ö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çin a/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çin w/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 veya FETCH 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_json_profile etkinlik birleştirmeyi önlemek istiyorsanız.

Ayrıca bkz. Chrome İzleme Etkinlik Biçimi Spesifikasyonu.