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, प्रोफ़ाइल फ़ॉर्मैट का इस्तेमाल करता है और बिल्ड की परफ़ॉर्मेंस को बेहतर बनाने के सुझाव देता है. यह विश्लेषण, 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 के वर्शन पर निर्भर करती हैं. साथ ही, इन्हें अलग-अलग फ़्लैग के हिसाब से पसंद के मुताबिक बनाया जा सकता है.
फ़िगर 1 में, 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
) में उम्मीद से ज़्यादा समय लगना, खास तौर पर इंक्रीमेंटल बिल्ड पर. यह नियम को सही तरीके से लागू न करने का संकेत हो सकता है. उदाहरण के लिए, ऐसा नियम जो डेपसेट को फ़्लैट कर देता है. ज़्यादा टारगेट, जटिल मैक्रो या बार-बार इस्तेमाल होने वाले ग्लोब की वजह से, पैकेज लोड होने में ज़्यादा समय लग सकता है. - अलग-अलग धीमी कार्रवाइयां, खास तौर पर क्रिटिकल पाथ पर मौजूद कार्रवाइयां. बड़ी कार्रवाइयों को कई छोटी कार्रवाइयों में बांटा जा सकता है. इसके अलावा, उन्हें तेज़ करने के लिए, (ट्रांज़िटिव) डिपेंडेंसी के सेट को कम किया जा सकता है. यह भी देखें कि
PROCESS_TIME
के अलावा, किसी अन्य वर्णों (जैसे,REMOTE_SETUP
याFETCH
) की संख्या बहुत ज़्यादा तो नहीं है. - बोटलनेक, यानी कुछ थ्रेड व्यस्त हैं, जबकि बाकी सभी थ्रेड काम नहीं कर रहे हैं / नतीजे का इंतज़ार कर रहे हैं. इन्हें देखने के लिए, पहली इमेज में 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_profile
पास करें.