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

किसी समस्या की शिकायत करें स्रोत देखें

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

डिफ़ॉल्ट रूप से, सभी बिल्ड-जैसे निर्देशों और क्वेरी के लिए, Bazel इस तरह की प्रोफ़ाइल 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 Subcommand 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 शुरू करने वाला विश्लेषक

ओपन सोर्स Bazel Invocution Analyzer प्रोफ़ाइल का फ़ॉर्मैट इस्तेमाल करता है और बिल्ड की परफ़ॉर्मेंस को बेहतर बनाने के सुझाव प्रिंट करता है. यह विश्लेषण इसके सीएलआई या 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 के उस वर्शन पर निर्भर करती हैं जो प्रोफ़ाइल बनाते समय शुरू किया गया था और जिसे अलग-अलग फ़्लैग से कस्टमाइज़ किया जा सकता है.

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

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

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

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

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

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

टॉप-लेवल ऑब्जेक्ट में मेटाडेटा (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 ट्रेस इवेंट फ़ॉर्मैट की खास जानकारी भी देखें.