इस पेज पर, 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फ़्लैग बदलने से बचें. उदाहरण के लिए,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 में जोड़ा गया है