शायद Bazel के हर उपयोगकर्ता ने ऐसे बिल्ड देखे होंगे जो धीमे थे या अनुमान से ज़्यादा धीमे थे. अलग-अलग बिल्ड की परफ़ॉर्मेंस को बेहतर बनाने से, उन टारगेट को खास फ़ायदा मिलता है जिन पर इसका काफ़ी असर पड़ता है. जैसे:
कोर डेवलपर टारगेट, जिन पर अक्सर बदलाव किए जाते हैं और जिन्हें (फिर से) बनाया जाता है.
आम लाइब्रेरी, जिन पर अन्य टारगेट काफ़ी हद तक निर्भर होते हैं.
टारगेट के किसी वर्ग (जैसे, कस्टम नियम) का कोई प्रतिनिधि टारगेट. किसी एक बिल्ड में समस्याओं का पता लगाने और उन्हें ठीक करने से, बड़े पैमाने पर समस्याओं को हल करने में मदद मिल सकती है.
बिल्ड की परफ़ॉर्मेंस को बेहतर बनाने के लिए, यह समझना ज़रूरी है कि संसाधन कहां खर्च किए जा रहे हैं. इस पेज पर, इकट्ठा की जा सकने वाली अलग-अलग मेट्रिक की सूची दी गई है. बिल्ड की परफ़ॉर्मेंस को अलग-अलग हिस्सों में बांटकर दिखाया गया है. इससे यह पता चलता है कि बिल्ड की परफ़ॉर्मेंस से जुड़ी समस्याओं का पता लगाने और उन्हें ठीक करने के लिए, इन मेट्रिक का इस्तेमाल कैसे किया जा सकता है.
Bazel के बिल्ड से मेट्रिक निकालने के कुछ मुख्य तरीके हैं. जैसे:
बिल्ड इवेंट प्रोटोकॉल (बीईपी)
Bazel, बिल्ड इवेंट प्रोटोकॉल (बीईपी) के ज़रिए, कई प्रोटोकॉल बफ़र
build_event_stream.proto
आउटपुट करता है. इन्हें आपके बताए गए बैकएंड से इकट्ठा किया जा सकता है.
अपने इस्तेमाल के उदाहरणों के हिसाब से, मेट्रिक को अलग-अलग तरीकों से इकट्ठा किया जा सकता है. हालांकि, यहां हम कुछ ऐसे कॉन्सेप्ट और प्रोटो फ़ील्ड के बारे में बताएंगे जो आम तौर पर आपके लिए काम के हो सकते हैं.
Bazel के query / cquery / aquery कमांड
Bazel, क्वेरी के तीन अलग-अलग मोड (query, cquery और aquery) उपलब्ध कराता है. इनकी मदद से, उपयोगकर्ता टारगेट ग्राफ़, कॉन्फ़िगर किए गए टारगेट ग्राफ़, और ऐक्शन ग्राफ़ के बारे में क्वेरी कर सकते हैं. क्वेरी लैंग्वेज, अलग-अलग क्वेरी मोड में इस्तेमाल किए जा सकने वाले फ़ंक्शन का एक सुइट उपलब्ध कराती है. इससे, अपनी ज़रूरतों के हिसाब से क्वेरी को पसंद के मुताबिक बनाया जा सकता है.
JSON फ़ॉर्मैट में ट्रेस प्रोफ़ाइल
Bazel के हर बिल्ड-जैसे इनवोकेशन के लिए, Bazel, JSON फ़ॉर्मैट में ट्रेस प्रोफ़ाइल लिखता है. JSON फ़ॉर्मैट में ट्रेस प्रोफ़ाइल, यह समझने में बहुत काम आ सकती है कि इनवोकेशन के दौरान Bazel ने किस काम में कितना समय लगाया.
एक्ज़ीक्यूशन लॉग
एक्ज़ीक्यूशन लॉग की मदद से, मशीन और एनवायरमेंट में अंतर या
नॉन-डिटरमिनिस्टिक ऐक्शन की वजह से, रिमोट कैश हिट न होने की समस्या को हल किया जा सकता है. अगर आपने फ़्लैग
--experimental_execution_log_spawn_metrics
(Bazel 5.2 से उपलब्ध) पास किया है, तो इसमें स्थानीय और रिमोट तौर पर एक्ज़ीक्यूट किए गए ऐक्शन, दोनों के लिए स्पॉन की विस्तृत मेट्रिक भी शामिल होंगी. उदाहरण के लिए, इन मेट्रिक का इस्तेमाल करके, स्थानीय और रिमोट मशीन की परफ़ॉर्मेंस की तुलना की जा सकती है. साथ ही, यह पता लगाया जा सकता है कि स्पॉन एक्ज़ीक्यूशन का कौनसी हिस्सा उम्मीद से ज़्यादा धीमा है. जैसे, क्यूइंग की वजह से.
एक्ज़ीक्यूशन ग्राफ़ लॉग
JSON फ़ॉर्मैट में ट्रेस प्रोफ़ाइल में, क्रिटिकल पाथ की जानकारी होती है. हालांकि, कभी-कभी आपको एक्ज़ीक्यूट किए गए ऐक्शन के डिपेंडेंसी ग्राफ़ के बारे में ज़्यादा जानकारी की ज़रूरत होती है.
Bazel 6.0 से, एक्ज़ीक्यूट किए गए ऐक्शन और उनकी इंटर-डिपेंडेंसी के बारे में लॉग लिखने के लिए, फ़्लैग
--experimental_execution_graph_log और
--experimental_execution_graph_log_dep_type=all पास किए जा सकते हैं.
इस जानकारी का इस्तेमाल करके, यह समझा जा सकता है कि क्रिटिकल पाथ पर किसी नोड की वजह से कितना समय लग रहा है. डैग, एक्ज़ीक्यूशन ग्राफ़ से किसी नोड को हटाने पर, संभावित तौर पर बचाया जा सकने वाला समय होता है.
इस डेटा से, बिल्ड और ऐक्शन ग्राफ़ में बदलाव करने से पहले, उनके असर का अनुमान लगाने में मदद मिलती है.
bazel-bench की मदद से बेंचमार्किंग करना
Bazel bench, Git प्रोजेक्ट के लिए बेंचमार्किंग टूल है. इसका इस्तेमाल, इन मामलों में बिल्ड की परफ़ॉर्मेंस की बेंचमार्किंग के लिए किया जाता है:
प्रोजेक्ट बेंचमार्क: Bazel के एक वर्शन में, Git के दो कमिट की एक-दूसरे के ख़िलाफ़ बेंचमार्किंग करना. इसका इस्तेमाल, बिल्ड में रिग्रेशन का पता लगाने के लिए किया जाता है. ऐसा अक्सर डिपेंडेंसी जोड़ने की वजह से होता है.
Bazel बेंचमार्क: Git के एक कमिट में, Bazel के दो वर्शन की एक-दूसरे के ख़िलाफ़ बेंचमार्किंग करना. इसका इस्तेमाल, Bazel में रिग्रेशन का पता लगाने के लिए किया जाता है. ऐसा तब किया जाता है, जब Bazel को मेंटेन या फ़ोर्क किया जाता है.
बेंचमार्क, वॉल टाइम, सीपीयू टाइम, और सिस्टम टाइम के साथ-साथ, Bazel के रिटेन किए गए हीप साइज़ की निगरानी करते हैं.
हमारा सुझाव है कि Bazel bench को, ऐसे फ़िज़िकल मशीनों पर चलाएं जो सिर्फ़ इसी काम के लिए बनी हों और जिन पर अन्य प्रोसेस न चल रही हों. इससे, बदलाव के सोर्स को कम किया जा सकता है.