इटरेशन की स्पीड ऑप्टिमाइज़ करें

इस पेज पर, Bazel को बार-बार चलाने पर, उसके बिल्ड की परफ़ॉर्मेंस को ऑप्टिमाइज़ करने का तरीका बताया गया है.

Bazel का रनटाइम स्टेट

Bazel को शुरू करने के लिए, कई हिस्सों के बीच इंटरैक्शन होता है.

  • bazel कमांड लाइन इंटरफ़ेस (सीएलआई) एक ऐसा फ़्रंटएंड टूल है जिसका इस्तेमाल उपयोगकर्ता करते हैं. यह उपयोगकर्ताओं से निर्देश लेता है.

  • सीएलआई टूल, हर अलग-अलग आउटपुट बेस के लिए एक Bazel सर्वर शुरू करता है. Bazel सर्वर आम तौर पर चालू रहता है. हालांकि, कुछ समय तक कोई गतिविधि न होने पर, यह बंद हो जाता है, ताकि संसाधनों का इस्तेमाल न हो.

  • Bazel सर्वर, दिए गए निर्देश (build, run, cquery वगैरह) के लिए, लोड करने और विश्लेषण करने के चरण पूरे करता है. इस दौरान, यह मेमोरी में बिल्ड ग्राफ़ के ज़रूरी हिस्से बनाता है. इसके बाद मिलने वाले डेटा स्ट्रक्चर, Bazel सर्वर में विश्लेषण कैश मेमोरी के तौर पर सेव रहते हैं.

  • Bazel सर्वर, कार्रवाई को पूरा भी कर सकता है. इसके अलावा, अगर इसे रिमोट तरीके से कार्रवाई पूरी करने के लिए सेट अप किया गया है, तो यह कार्रवाई को रिमोट तरीके से पूरा करने के लिए भेज सकता है. कार्रवाई पूरी होने के बाद मिलने वाले नतीजे भी कैश मेमोरी में सेव होते हैं. इन्हें कार्रवाई कैश मेमोरी (या एक्ज़ीक्यूशन कैश मेमोरी ) में सेव किया जाता है. यह कैश मेमोरी, स्थानीय या रिमोट हो सकती है. साथ ही, इसे Bazel सर्वर के बीच शेयर किया जा सकता है.

  • Bazel को शुरू करने के बाद मिलने वाला नतीजा, आउटपुट ट्री में उपलब्ध होता है.

Bazel को बार-बार चलाना

डेवलपर के सामान्य वर्कफ़्लो में, कोड के किसी हिस्से को बार-बार बनाया (या चलाया) जाता है.ऐसा अक्सर बहुत ज़्यादा फ़्रीक्वेंसी पर किया जाता है. उदाहरण के लिए, कंपाइलेशन से जुड़ी किसी गड़बड़ी को ठीक करने या किसी टेस्ट के फ़ेल होने की वजह जानने के लिए. ऐसे में, यह ज़रूरी है कि bazel को बार-बार शुरू करने पर, बार-बार की जाने वाली कार्रवाई (उदाहरण के लिए, कंपाइलर को शुरू करना या टेस्ट को पूरा करना) के मुकाबले, कम से कम ओवरहेड हो.

इसे ध्यान में रखते हुए, हम Bazel के रनटाइम स्टेट पर एक बार फिर से नज़र डालते हैं:

विश्लेषण कैश मेमोरी, डेटा का अहम हिस्सा होती है. कोल्ड रन (यानी, Bazel सर्वर शुरू होने के तुरंत बाद या विश्लेषण कैश मेमोरी को मिटाने के बाद) के दौरान, सिर्फ़ लोड करने और विश्लेषण के चरणों में काफ़ी समय लग सकता है. एक बार, कोल्ड बिल्ड को सफलतापूर्वक पूरा करने (उदाहरण के लिए, प्रोडक्शन रिलीज़ के लिए) पर, यह लागत बर्दाश्त की जा सकती है. हालांकि, एक ही टारगेट को बार-बार बनाने के लिए, यह लागत हर बार नहीं लगनी चाहिए.

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

बिल्ड की परफ़ॉर्मेंस के लिए, अच्छी एक्ज़ीक्यूशन कैश मेमोरी भी ज़रूरी है. एक्ज़ीक्यूशन कैश मेमोरी को स्थानीय तौर पर डिस्क पर या रिमोट तरीके से सेव किया जा सकता है. कैश मेमोरी को Bazel सर्वर के साथ-साथ डेवलपर के बीच भी शेयर किया जा सकता है.

विश्लेषण कैश मेमोरी को मिटाने से बचें

अगर विश्लेषण कैश मेमोरी मिट गई है या सर्वर रीस्टार्ट हो गया है, तो Bazel एक चेतावनी दिखाएगा. बार-बार इस्तेमाल करने के दौरान, इनमें से किसी भी स्थिति से बचना चाहिए:

  • बार-बार इस्तेमाल करने वाले वर्कफ़्लो के बीच में, bazel फ़्लैग बदलने से बचें. उदाहरण के लिए, bazel build -c opt को bazel cquery के साथ मिक्स करने पर, हर निर्देश से दूसरे की विश्लेषण कैश मेमोरी मिट जाती है. आम तौर पर, किसी खास वर्कफ़्लो के दौरान, फ़्लैग के एक ही सेट का इस्तेमाल करने की कोशिश करें.

  • Bazel सर्वर बंद होने पर, विश्लेषण कैश मेमोरी मिट जाती है. Bazel सर्वर के लिए, कोई गतिविधि न होने पर बंद होने का समय कॉन्फ़िगर किया जा सकता है. इसके बाद, यह बंद हो जाता है. अपनी ज़रूरत के हिसाब से, bazelrc फ़ाइल का इस्तेमाल करके, इस समय को कॉन्फ़िगर किया जा सकता है. स्टार्टअप फ़्लैग में बदलाव करने पर भी सर्वर रीस्टार्ट हो जाता है. इसलिए, अगर मुमकिन हो, तो उन फ़्लैग में बदलाव करने से बचें.

  • ध्यान दें कि Bazel के चालू रहने के दौरान, Ctrl-C को बार-बार दबाने पर, Bazel सर्वर बंद हो जाता है. ऐसा हो सकता है कि आपको किसी ऐसे बिल्ड को बीच में रोककर समय बचाने की कोशिश करनी हो जिसकी अब ज़रूरत नहीं है. हालांकि, मौजूदा कार्रवाई को सही तरीके से खत्म करने का अनुरोध करने के लिए, Ctrl-C को सिर्फ़ एक बार दबाएं.

  • अगर आपको एक ही वर्कस्पेस से फ़्लैग के कई सेट इस्तेमाल करने हैं, तो --output_base फ़्लैग की मदद से स्विच किए गए, अलग-अलग आउटपुट बेस का इस्तेमाल किया जा सकता है. हर आउटपुट बेस के लिए, अपना Bazel सर्वर होता है.

इस स्थिति को चेतावनी के बजाय गड़बड़ी के तौर पर दिखाने के लिए, --noallow_analysis_cache_discard फ़्लैग (Bazel 6.4.0 में जोड़ा गया) का इस्तेमाल किया जा सकता है.