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

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