बिल्ड परफ़ॉर्मेंस मेट्रिक निकालना

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

  1. कोर डेवलपर टारगेट, जिन पर बार-बार काम किया जाता है और जिन्हें (फिर से) बनाया जाता है.

  2. आम लाइब्रेरी, जिन पर अन्य टारगेट काफ़ी हद तक निर्भर होते हैं.

  3. टारगेट के किसी क्लास (जैसे, कस्टम नियम) से कोई प्रतिनिधि टारगेट. किसी एक बिल्ड में समस्याओं का पता लगाने और उन्हें ठीक करने से, बड़े पैमाने पर समस्याओं को हल करने में मदद मिल सकती है.

बिल्ड की परफ़ॉर्मेंस को बेहतर बनाने के लिए, यह समझना ज़रूरी है कि संसाधन कहां खर्च किए जा रहे हैं. इस पेज पर, इकट्ठा की जा सकने वाली अलग-अलग मेट्रिक की सूची दी गई है. बिल्ड की परफ़ॉर्मेंस को अलग-अलग हिस्सों में बांटकर दिखाया गया है कि बिल्ड की परफ़ॉर्मेंस से जुड़ी समस्याओं का पता लगाने और उन्हें ठीक करने के लिए, इन मेट्रिक का इस्तेमाल कैसे किया जा सकता है.

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 को उन फ़िज़िकल मशीनों पर चलाया जाए जो सिर्फ़ इसी काम के लिए बनी हैं और जिन पर कोई अन्य प्रोसेस नहीं चल रही है. इससे, बदलाव के सोर्स कम हो जाते हैं.