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

समस्या की शिकायत करें सोर्स देखें

इस पेज पर बताया गया है कि बार-बार 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 सर्वर मिलता है.