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