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

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

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

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

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

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

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

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

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