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

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

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

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

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

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

Bazel के बिल्ड से मेट्रिक निकालने के कुछ मुख्य तरीके हैं. जैसे:

बिल्ड इवेंट प्रोटोकॉल (बीईपी)

Bazel, बिल्ड इवेंट प्रोटोकॉल (बीईपी) के ज़रिए, कई प्रोटोकॉल बफ़र build_event_stream.proto आउटपुट करता है. इन्हें आपके बताए गए बैकएंड से इकट्ठा किया जा सकता है. अपने इस्तेमाल के उदाहरणों के आधार पर, मेट्रिक को अलग-अलग तरीकों से इकट्ठा किया जा सकता है. हालांकि, यहां हम कुछ ऐसे कॉन्सेप्ट और प्रोटो फ़ील्ड के बारे में बताएंगे जो आम तौर पर आपके लिए काम के हो सकते हैं.

Bazel के क्वेरी / cquery / aquery निर्देश

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