JSON ट्रेस प्रोफ़ाइल

किसी समस्या की शिकायत करें सोर्स देखें Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

JSON ट्रेस प्रोफ़ाइल का इस्तेमाल करके, यह तुरंत समझा जा सकता है कि Bazel ने कॉल के दौरान किस काम पर समय बिताया.

डिफ़ॉल्ट रूप से, बिल्ड जैसे सभी निर्देशों और क्वेरी के लिए, Basel की प्रोफ़ाइल command.profile.gz पर ऐसी प्रोफ़ाइल लिखती है. आपके पास यह कॉन्फ़िगर करने का विकल्प है कि प्रोफ़ाइल, --generate_json_trace_profile फ़्लैग के साथ लिखी गई है या नहीं. साथ ही, --profile फ़्लैग की मदद से यह भी कॉन्फ़िगर किया जा सकता है कि प्रोफ़ाइल किस जगह पर लिखी गई है. .gz पर खत्म होने वाली जगहों को GZIP से कंप्रेस किया जाता है. इस फ़ाइल का पाथ लॉग में प्रिंट करने के लिए, फ़्लैग --experimental_announce_profile_path का इस्तेमाल करें.

टूल

इस प्रोफ़ाइल को chrome://tracing में लोड किया जा सकता है या अन्य टूल की मदद से इसका विश्लेषण किया जा सकता है और इसे पोस्ट-प्रोसेस किया जा सकता है.

chrome://tracing

प्रोफ़ाइल को विज़ुअलाइज़ करने के लिए, Chrome ब्राउज़र टैब में chrome://tracing खोलें. इसके बाद, "लोड करें" पर क्लिक करें और प्रोफ़ाइल फ़ाइल (संभवतः कंप्रेस की गई) चुनें. ज़्यादा जानकारी वाले नतीजों के लिए, नीचे बाएं कोने में मौजूद बॉक्स पर क्लिक करें.

प्रोफ़ाइल का उदाहरण:

प्रोफ़ाइल का उदाहरण

पहली इमेज. प्रोफ़ाइल का उदाहरण.

इन कीबोर्ड कंट्रोल का इस्तेमाल करके, इन पर नेविगेट किया जा सकता है:

  • "चुनें" मोड के लिए 1 दबाएं. इस मोड में, इवेंट की जानकारी की जांच करने के लिए, कुछ बॉक्स चुने जा सकते हैं (नीचे बाएं कोने में देखें). खास जानकारी और एग्रीगेट किए गए आंकड़े पाने के लिए, एक से ज़्यादा इवेंट चुनें.
  • "पैन" मोड के लिए 2 दबाएं. इसके बाद, व्यू को मूव करने के लिए माउस को खींचें और छोड़ें. बाईं/दाईं ओर जाने के लिए, a/d का भी इस्तेमाल किया जा सकता है.
  • "ज़ूम" मोड के लिए, 3 दबाएं. इसके बाद, ज़ूम करने के लिए माउस को खींचें और छोड़ें. ज़ूम इन/आउट करने के लिए, w/s का भी इस्तेमाल किया जा सकता है.
  • "टाइमिंग" मोड के लिए 4 दबाएं. इस मोड में, दो इवेंट के बीच की दूरी को मेज़र किया जा सकता है.
  • सभी कंट्रोल के बारे में जानने के लिए ? दबाएं.

bazel analyze-profile

Bazel सब-कमांड analyze-profile, प्रोफ़ाइल फ़ॉर्मैट का इस्तेमाल करता है. साथ ही, हर बिल्ड फ़ेज़ के लिए अलग-अलग तरह के टास्क के लिए इकट्ठा किए गए आंकड़े और क्रिटिकल पाथ का विश्लेषण प्रिंट करता है.

उदाहरण के लिए,

$ bazel build --profile=/tmp/profile.gz //path/to:target
...
$ bazel analyze-profile /tmp/profile.gz

का आउटपुट मिल सकता है:

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 Invocation Analyzer, प्रोफ़ाइल फ़ॉर्मैट का इस्तेमाल करता है और बिल्ड की परफ़ॉर्मेंस को बेहतर बनाने के सुझाव देता है. यह विश्लेषण, CLI या https://analyzer.engflow.com पर किया जा सकता है.

jq

JSON डेटा के लिए jq, sed की तरह है. स्थानीय कार्रवाई को लागू करने के दौरान, सैंडबॉक्स बनाने के चरण की कुल अवधि निकालने के लिए, jq के इस्तेमाल का उदाहरण:

$ 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
[...]

प्रोफ़ाइल की जानकारी

प्रोफ़ाइल में कई लाइनें हों. आम तौर पर, ज़्यादातर पंक्तियां Bazel थ्रेड और उनसे जुड़े इवेंट दिखाती हैं. हालांकि, कुछ खास पंक्तियां भी शामिल होती हैं.

प्रोफ़ाइल बनाते समय, Bazel के जिस वर्शन का इस्तेमाल किया गया है उसके आधार पर, खास लाइनें शामिल की जाती हैं. साथ ही, अलग-अलग फ़्लैग की मदद से इन लाइन को पसंद के मुताबिक बनाया जा सकता है.

पहली इमेज में, Basel v5.3.1 की मदद से बनाई गई प्रोफ़ाइल दिखाई गई है. इसमें ये लाइनें शामिल हैं:

  • action count: इससे पता चलता है कि एक साथ कितनी कार्रवाइयां की गईं. असल वैल्यू देखने के लिए, उस पर क्लिक करें. यह वैल्यू, क्लीन बिल्ड में --jobs तक होनी चाहिए.
  • CPU usage (Bazel): यह हर सेकंड के लिए, Bazel के इस्तेमाल किए गए सीपीयू की संख्या दिखाता है. वैल्यू 1 का मतलब है कि एक कोर 100% व्यस्त है.
  • Critical Path: क्रिटिकल पाथ पर हर कार्रवाई के लिए एक ब्लॉक दिखाता है.
  • Main Thread: Bazel की मुख्य थ्रेड. इससे यह जानने में मदद मिलती है कि Bazel क्या कर रहा है. उदाहरण के लिए, "Launch Blaze", "evaluateTargetPatterns", और "runAnalysisPhase".
  • Garbage Collector: छोटे और बड़े कचरे के कलेक्शन (जीसी) रोक को दिखाता है.

परफ़ॉर्मेंस से जुड़ी सामान्य समस्याएं

परफ़ॉर्मेंस प्रोफ़ाइलों का विश्लेषण करते समय, इन बातों का ध्यान रखें:

  • विश्लेषण के फ़ेज़ (runAnalysisPhase) में उम्मीद से ज़्यादा समय लगना, खास तौर पर इंक्रीमेंटल बिल्ड पर. यह नियम को सही तरीके से लागू न करने का संकेत हो सकता है. उदाहरण के लिए, ऐसा नियम जो डेपसेट को फ़्लैट कर देता है. पैकेज लोडिंग बहुत ज़्यादा टारगेट, जटिल मैक्रो या बार-बार होने वाले ग्लोब से धीमी गति से हो सकती है.
  • अलग-अलग धीमी कार्रवाइयां, खास तौर पर क्रिटिकल पाथ पर मौजूद कार्रवाइयां. बड़ी कार्रवाइयों को कई छोटी कार्रवाइयों में बांटा जा सकता है या उन्हें तेज़ करने के लिए, (ट्रांज़िटिव) डिपेंडेंसी के सेट को कम किया जा सकता है. यह भी देखें कि PROCESS_TIME के अलावा, कोई और वैल्यू (जैसे, REMOTE_SETUP या FETCH) बहुत ज़्यादा तो नहीं है.
  • बोटलनेक, यानी कुछ थ्रेड व्यस्त हैं, जबकि बाकी सभी थ्रेड काम नहीं कर रहे हैं / नतीजे का इंतज़ार कर रहे हैं. इन्हें फ़िगर 1 में 22 सेकंड और 29 सेकंड के आस-पास देखें. इसे ऑप्टिमाइज़ करने के लिए, ज़्यादा पैरलल प्रोसेसिंग लागू करने के लिए, नियम लागू करने की प्रोसेस या Bazel को बदलना पड़ सकता है. ऐसा तब भी हो सकता है, जब जीसी की संख्या बहुत ज़्यादा हो.

प्रोफ़ाइल फ़ाइल का फ़ॉर्मैट

टॉप-लेवल ऑब्जेक्ट में मेटाडेटा (otherData) और असल ट्रैकिंग डेटा (traceEvents) होता है. मेटाडेटा में अतिरिक्त जानकारी होती है. उदाहरण के लिए, Bazel को शुरू करने का आईडी और तारीख.

उदाहरण:

{
  "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},
 ]
}

ट्रेस इवेंट में टाइमस्टैंप (ts) और कुल समय (dur) माइक्रोसेकंड में दिया जाता है. कैटगरी (cat), ProfilerTask की एनम वैल्यू में से एक है. ध्यान दें कि अगर कुछ इवेंट बहुत छोटे और एक-दूसरे के करीब हैं, तो उन्हें एक साथ मर्ज कर दिया जाता है. अगर आपको इवेंट को मर्ज होने से रोकना है, तो --noslim_json_profile पास करें.

Chrome ट्रैस इवेंट फ़ॉर्मैट स्पेसिफ़िकेशन भी देखें.