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

समस्या की शिकायत करें सोर्स देखें Nightly · 8.4 · 8.3 · 8.2 · 8.1 · 8.0 · 7.6

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