JSON ट्रेस प्रोफ़ाइल की मदद से, यह तुरंत समझा जा सकता है कि Bazel ने इनवॉकेशन के दौरान किस काम में कितना समय लगाया.
डिफ़ॉल्ट रूप से, Bazel, बिल्ड जैसी सभी कमांड और क्वेरी के लिए, command-$INVOCATION_ID.profile.gz नाम के आउटपुट बेस में एक प्रोफ़ाइल लिखता है. यहां $INVOCATION_ID, कमांड का इनवोकेशन आइडेंटिफ़ायर है. Bazel, आउटपुट बेस में command.profile.gz नाम का एक सिमलिंक भी बनाता है. यह सिमलिंक, सबसे हाल के निर्देश की प्रोफ़ाइल दिखाता है. यह कॉन्फ़िगर किया जा सकता है कि किसी प्रोफ़ाइल को --generate_json_trace_profile फ़्लैग के साथ लिखा गया है या नहीं. साथ ही, यह भी कॉन्फ़िगर किया जा सकता है कि उसे --profile फ़्लैग के साथ किस जगह पर लिखा गया है. .gz से खत्म होने वाली जगहों को GZIP की मदद से कंप्रेस किया जाता है. Bazel, डिफ़ॉल्ट रूप से आउटपुट बेस में, पिछले पांच प्रोफ़ाइल को सेव रखता है. इन्हें --profiles_to_retain की मदद से कॉन्फ़िगर किया जा सकता है. ऐसा, बिल्ड के बाद के विश्लेषण के लिए किया जाता है. --profile के साथ प्रोफ़ाइल पाथ को साफ़ तौर पर पास करने से, अपने-आप गार्बेज कलेक्शन की सुविधा बंद हो जाती है.
टूल
इस प्रोफ़ाइल को chrome://tracing में लोड किया जा सकता है. इसके अलावा, इसे अन्य टूल की मदद से प्रोसेस किया जा सकता है और इसका विश्लेषण किया जा सकता है.
chrome://tracing
प्रोफ़ाइल को विज़ुअलाइज़ करने के लिए, Chrome ब्राउज़र टैब में chrome://tracing खोलें. इसके बाद, "लोड करें" पर क्लिक करें और (संभावित रूप से कंप्रेस की गई) प्रोफ़ाइल फ़ाइल चुनें. ज़्यादा जानकारी वाले नतीजे देखने के लिए, नीचे बाएं कोने में मौजूद बॉक्स पर क्लिक करें.
प्रोफ़ाइल का उदाहरण:

पहली इमेज. प्रोफ़ाइल का उदाहरण.
नेविगेट करने के लिए, इन कीबोर्ड कंट्रोल का इस्तेमाल किया जा सकता है:
- "चुनें" मोड के लिए,
1दबाएं. इस मोड में, इवेंट की जानकारी देखने के लिए कुछ बॉक्स चुने जा सकते हैं. इसके लिए, नीचे बाएं कोने में जाएं. खास जानकारी और एग्रीगेट किए गए आंकड़े पाने के लिए, एक से ज़्यादा इवेंट चुनें. - "पैन" मोड के लिए,
2दबाएं. इसके बाद, व्यू को मूव करने के लिए माउस को खींचें और छोड़ें. बाईं/दाईं ओर जाने के लिए,a/dका भी इस्तेमाल किया जा सकता है. - "ज़ूम" मोड के लिए,
3दबाएं. इसके बाद, ज़ूम करने के लिए माउस को खींचें. ज़ूम इन/आउट करने के लिए,w/sका इस्तेमाल भी किया जा सकता है. - "टाइमिंग" मोड के लिए
4दबाएं. इस मोड में, दो इवेंट के बीच की दूरी को मेज़र किया जा सकता है. - सभी कंट्रोल के बारे में जानने के लिए,
?दबाएं.
Bazel Invocation Analyzer
ओपन-सोर्स Bazel Invocation Analyzer, प्रोफ़ाइल फ़ॉर्मैट का इस्तेमाल करता है. साथ ही, यह सुझाव देता है कि बिल्ड की परफ़ॉर्मेंस को कैसे बेहतर बनाया जाए. इस विश्लेषण को इसके सीएलआई का इस्तेमाल करके या https://analyzer.engflow.com पर किया जा सकता है.
jq
jq, JSON डेटा के लिए 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 के उस वर्शन पर निर्भर करती हैं जिसका इस्तेमाल प्रोफ़ाइल बनाते समय किया गया था. साथ ही, इन्हें अलग-अलग फ़्लैग के हिसाब से पसंद के मुताबिक बनाया जा सकता है.
पहली इमेज में, Bazel 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) में उम्मीद से ज़्यादा समय लगता है. ऐसा खास तौर पर, इंक्रीमेंटल बिल्ड पर होता है. यह नियम को सही तरीके से लागू न करने का संकेत हो सकता है. उदाहरण के लिए, ऐसा नियम जो depsets को फ़्लैट करता है. ज़्यादा टारगेट, मुश्किल मैक्रो या रिकर्सिव ग्लोब की वजह से, पैकेज लोड होने में ज़्यादा समय लग सकता है. - अलग-अलग कार्रवाइयों में होने वाली देरी, खास तौर पर अहम पाथ पर होने वाली कार्रवाइयों में. ऐसा हो सकता है कि बड़ी कार्रवाइयों को कई छोटी कार्रवाइयों में बांटा जा सके या उन्हें तेज़ी से पूरा करने के लिए, (ट्रांज़िटिव) डिपेंडेंसी के सेट को कम किया जा सके. यह भी देखें कि क्या किसी असामान्य रूप से ज़्यादा गैर-
PROCESS_TIME(जैसे किREMOTE_SETUPयाFETCH) का इस्तेमाल किया गया है. - बॉटलनेक, यानी कि कुछ थ्रेड व्यस्त हैं, जबकि बाकी सभी थ्रेड आइडल हैं / नतीजे का इंतज़ार कर रही हैं (आंकड़े 1 में 22 सेकंड और 29 सेकंड के आस-पास देखें). इसे ऑप्टिमाइज़ करने के लिए, नियम लागू करने या Bazel में बदलाव करने की ज़रूरत पड़ सकती है, ताकि ज़्यादा समानताएं लाई जा सकें. ऐसा तब भी हो सकता है, जब GC की मात्रा असामान्य हो.
प्रोफ़ाइल फ़ाइल फ़ॉर्मैट
टॉप-लेवल ऑब्जेक्ट में मेटाडेटा (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_profile पास करें.
Chrome Trace Event Format Specification भी देखें.