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

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