मेमोरी ऑप्टिमाइज़ करें

इस पेज पर, Bazel के लिए मेमोरी के इस्तेमाल को सीमित और कम करने का तरीका बताया गया है.

सीमित रैम के साथ Bazel का इस्तेमाल करना

कुछ मामलों में, हो सकता है कि आपको Bazel के लिए कम से कम मेमोरी का इस्तेमाल करना हो. स्टार्टअप फ़्लैग --host_jvm_args की मदद से, ज़्यादा से ज़्यादा हीप सेट किया जा सकता है. जैसे, --host_jvm_args=-Xmx2g.

मेमोरी के लिए, इंक्रीमेंटल बिल्ड की स्पीड कम करना

अगर आपके बिल्ड बहुत बड़े हैं, तो हो सकता है कि Bazel के पास पर्याप्त मेमोरी न होने पर, OutOfMemoryError (OOM) दिखे. Bazel के लिए कम मेमोरी का इस्तेमाल किया जा सकता है. हालांकि, इसके लिए इंक्रीमेंटल बिल्ड की स्पीड कम करनी होगी. इसके लिए, ये कमांड फ़्लैग पास करें: --discard_analysis_cache, --nokeep_state_after_build, और --notrack_incremental_state.

इन फ़्लैग की मदद से, Bazel के लिए किसी बिल्ड में इस्तेमाल की जाने वाली मेमोरी को कम किया जा सकेगा. हालांकि, इसके लिए आने वाले समय में बनने वाले बिल्ड की स्पीड, सामान्य इंक्रीमेंटल बिल्ड की तुलना में कम होगी.

इनमें से कोई भी फ़्लैग अलग-अलग पास किया जा सकता है:

  • --discard_analysis_cache से, एक्ज़ीक्यूशन के दौरान इस्तेमाल होने वाली मेमोरी कम हो जाएगी. हालांकि, इससे विश्लेषण के दौरान इस्तेमाल होने वाली मेमोरी कम नहीं होगी. इंक्रीमेंटल बिल्ड के लिए, पैकेज लोड करने की प्रोसेस को दोबारा नहीं करना होगा. हालांकि, विश्लेषण और एक्ज़ीक्यूशन की प्रोसेस को दोबारा करना होगा. हालांकि, डिस्क पर मौजूद ऐक्शन कैश की मदद से, ज़्यादातर री-एक्ज़ीक्यूशन को रोका जा सकता है.
  • --notrack_incremental_state से, Bazel के इंटरनल डिपेंडेंसी ग्राफ़ में कोई भी एज सेव नहीं होगा. इसलिए, इसका इस्तेमाल इंक्रीमेंटल बिल्ड के लिए नहीं किया जा सकेगा. अगले बिल्ड में उस डेटा को मिटा दिया जाएगा. हालांकि, --nokeep_state_after_build के बारे में न बताए जाने पर, इंटरनल डीबग करने के लिए, डेटा तब तक सेव रहेगा.
  • --nokeep_state_after_build से, बिल्ड के बाद सारा डेटा मिटा दिया जाएगा. इसलिए, इंक्रीमेंटल बिल्ड के लिए, शुरू से बिल्ड करना होगा. हालांकि, डिस्क पर मौजूद ऐक्शन कैश को छोड़कर. इससे, मौजूदा बिल्ड के हाई-वॉटर मार्क पर कोई असर नहीं पड़ता.

Skyfocus (एक्सपेरिमेंटल) की मदद से, मेमोरी के लिए बिल्ड की फ़्लेक्सिबिलिटी कम करना

अगर आपको Bazel के लिए कम मेमोरी का इस्तेमाल करना है और इंक्रीमेंटल बिल्ड की स्पीड बनाए रखनी है, तो Bazel को उन फ़ाइलों के वर्किंग सेट के बारे में बताएं जिनमें आपको बदलाव करना है. इसके बाद, Bazel सिर्फ़ उन फ़ाइलों में किए गए बदलावों को सही तरीके से इंक्रीमेंटल तरीके से फिर से बनाने के लिए ज़रूरी स्टेट को सेव करेगा. इस सुविधा को Skyfocus कहा जाता है.

Skyfocus का इस्तेमाल करने के लिए, --experimental_enable_skyfocus फ़्लैग पास करें:

bazel build //pkg:target --experimental_enable_skyfocus

डिफ़ॉल्ट रूप से, वर्किंग सेट, टारगेट के बगल में मौजूद फ़ाइलों का सेट होगा. उदाहरण के लिए, //pkg में मौजूद सभी फ़ाइलों को वर्किंग सेट में सेव किया जाएगा. साथ ही, bazel clean जारी करने या Bazel सर्वर को रीस्टार्ट करने तक, वर्किंग सेट के बाहर मौजूद फ़ाइलों में किए गए बदलावों की अनुमति नहीं दी जाएगी.

अगर आपको फ़ाइलों या डायरेक्ट्री का कोई खास सेट तय करना है, तो --experimental_working_set फ़्लैग का इस्तेमाल करें. जैसे:

bazel build //pkg:target --experimental_enable_skyfocus
--experimental_working_set=path/to/another/dir,path/to/tests/dir

मेमोरी में कमी की रकम दिखाने के लिए, --experimental_skyfocus_dump_post_gc_stats भी पास किया जा सकता है:

इसे एक साथ इस्तेमाल करने पर, आपको कुछ ऐसा दिखेगा:

$ bazel test //pkg:target //tests/... --experimental_enable_skyfocus --experimental_working_set dir1,dir2,dir3/subdir --experimental_skyfocus_dump_post_gc_stats
INFO: --experimental_enable_skyfocus is enabled. Blaze will reclaim memory not needed to build the working set. Run 'blaze dump --skyframe=working_set' to show the working set, after this command.
WARNING: Changes outside of the working set will cause a build error.
INFO: Analyzed 149 targets (4533 packages loaded, 169438 targets configured).
INFO: Found 25 targets and 124 test targets...
INFO: Updated working set successfully.
INFO: Focusing on 334 roots, 3 leafs... (use --experimental_skyfocus_dump_keys to show them)
INFO: Heap: 1237MB -> 676MB (-45.31%)
INFO: Elapsed time: 192.670s ...
INFO: Build completed successfully, 62303 total actions

इस उदाहरण के लिए, Skyfocus का इस्तेमाल करने से, Bazel के लिए 561 एमबी (45%) मेमोरी कम हो गई. साथ ही, इंक्रीमेंटल बिल्ड के लिए, dir1, dir2, और dir3/subdir में मौजूद फ़ाइलों में किए गए बदलावों को तेज़ी से हैंडल किया जा सकेगा. हालांकि, इसके लिए Bazel, इन डायरेक्ट्री के बाहर मौजूद बदली गई फ़ाइलों को फिर से नहीं बना पाएगा.

मेमोरी प्रोफ़ाइलिंग

Bazel में, मेमोरी प्रोफ़ाइलर की सुविधा पहले से मौजूद होती है. इसकी मदद से, अपने नियम के लिए मेमोरी के इस्तेमाल की जांच की जा सकती है. कस्टम नियमों की परफ़ॉर्मेंस बेहतर बनाने के तरीके के बारे में हमारी दस्तावेज़ में, मेमोरी प्रोफ़ाइलिंग सेक्शन में इस प्रोसेस के बारे में ज़्यादा जानें.