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

इस पेज पर, 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 में, मेमोरी प्रोफ़ाइलर की सुविधा पहले से मौजूद होती है. इसकी मदद से, अपने नियम के लिए इस्तेमाल की जाने वाली मेमोरी की जानकारी देखी जा सकती है. कस्टम नियमों की परफ़ॉर्मेंस बेहतर बनाने के तरीके के बारे में हमारी दस्तावेज़ में, मेमोरी प्रोफ़ाइलिंग सेक्शन में इस प्रोसेस के बारे में ज़्यादा पढ़ें.