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

इस पेज पर, 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 में जोड़ा गया है