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

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