इस पेज पर, 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 में पेश किया गया था.