Android लो मेमोरी किलर डीमन (lmkd) प्रोसेस, चालू Android सिस्टम की मेमोरी की स्थिति पर नज़र रखती है. साथ ही, मेमोरी पर ज़्यादा दबाव पड़ने पर, सबसे कम ज़रूरी प्रोसेस को बंद कर देती है, ताकि सिस्टम ठीक से काम करता रहे.
मेमोरी प्रेशर के बारे में जानकारी
Android सिस्टम में एक साथ कई प्रोसेस चल रही हों, तो ऐसी स्थितियां आ सकती हैं, जब सिस्टम की मेमोरी खत्म हो जाती है. साथ ही, जिन प्रोसेस के लिए ज़्यादा मेमोरी की ज़रूरत होती है उनमें देरी होती है. मेमोरी प्रेशर एक ऐसी स्थिति होती है जिसमें सिस्टम में मेमोरी कम हो जाती है. इस स्थिति में, Android को मेमोरी खाली करने की ज़रूरत होती है, ताकि मेमोरी प्रेशर कम किया जा सके. इसके लिए, वह कम ज़रूरी प्रोसेस को थ्रॉटल या बंद कर देता है. साथ ही, प्रोसेस से गैर-ज़रूरी कैश किए गए संसाधनों को खाली करने का अनुरोध करता है.
पहले, Android, सिस्टम मेमोरी पर पड़ने वाले दबाव की निगरानी के लिए, कर्नेल में मौजूद लो मेमोरी किलर (एलएमके) ड्राइवर का इस्तेमाल करता था. यह एक ऐसा तरीका है जो हार्ड-कोड की गई वैल्यू पर निर्भर करता है. कर्नेल 4.12 से, एलएमके ड्राइवर को अपस्ट्रीम कर्नेल से हटा दिया गया है. साथ ही, यूज़रस्पेस lmkd मेमोरी मॉनिटरिंग और प्रोसेस किलिंग के टास्क करता है.
प्रेशर स्टॉल की जानकारी
Android 10 और इसके बाद के वर्शन में, एक नया lmkd मोड काम करता है. यह मोड, मेमोरी प्रेशर का पता लगाने के लिए, कर्नल प्रेशर स्टॉल इन्फ़ॉर्मेशन (पीएसआई) मॉनिटर का इस्तेमाल करता है. अपस्ट्रीम कर्नल में मौजूद पीएसआई पैचसेट (4.9 और 4.14 कर्नल में बैकपोर्ट किया गया) से यह पता चलता है कि मेमोरी की कमी की वजह से, टास्क में कितना समय लगता है. इनमें होने वाली देरी से, सीधे तौर पर उपयोगकर्ता अनुभव पर असर पड़ता है. इसलिए, ये मेमोरी प्रेशर की गंभीरता का पता लगाने के लिए एक सुविधाजनक मेट्रिक हैं. अपस्ट्रीम कर्नल में पीएसआई मॉनिटर भी शामिल होते हैं. इनकी मदद से, खास अधिकार वाले यूज़रस्पेस प्रोसेस (जैसे कि lmkd) इन देरी के लिए थ्रेशोल्ड तय कर सकती हैं. साथ ही, थ्रेशोल्ड का उल्लंघन होने पर, कर्नल से इवेंट के लिए सदस्यता ले सकती हैं.
PSI मॉनिटर बनाम vmpressure सिग्नल
vmpressure सिग्नल (मेमोरी पर दबाव का पता लगाने के लिए कर्नल जनरेट करता है और lmkd इसका इस्तेमाल करता है) में अक्सर कई फ़ॉल्स पॉज़िटिव शामिल होते हैं. इसलिए, lmkd को फ़िल्टरिंग करनी चाहिए, ताकि यह पता चल सके कि मेमोरी पर वाकई दबाव है या नहीं.
इससे, lmkd बार-बार चालू होता है और कंप्यूटिंग के अतिरिक्त संसाधनों का इस्तेमाल होता है. पीएसआई मॉनिटर का इस्तेमाल करने से, मेमोरी पर पड़ने वाले दबाव का ज़्यादा सटीक तरीके से पता चलता है. साथ ही, फ़िल्टर करने में लगने वाला समय कम हो जाता है.
पीएसआई मॉनिटर का इस्तेमाल करना
vmpressure इवेंट के बजाय, पीएसआई मॉनिटर का इस्तेमाल करने के लिए, ro.lmk.use_psi प्रॉपर्टी को कॉन्फ़िगर करें. डिफ़ॉल्ट वैल्यू true होती है. इससे पीएसआई, lmkd के लिए मेमोरी प्रेशर का पता लगाने वाले डिफ़ॉल्ट तरीके की निगरानी करता है. पीएसआई मॉनिटर के लिए कर्नेल सपोर्ट की ज़रूरत होती है. इसलिए, कर्नेल में पीएसआई बैकपोर्ट पैच शामिल होने चाहिए. साथ ही, इसे पीएसआई सपोर्ट चालू (CONFIG_PSI=y) करके कंपाइल किया जाना चाहिए.
इन-कर्नल एलएमके ड्राइवर की कमियां
Android, LMK ड्राइवर को बंद कर रहा है. इसकी कई वजहें हैं. जैसे:
- कम रैम वाले डिवाइसों को ज़्यादा ट्यून करना पड़ता था. इसके बावजूद, वे बड़ी फ़ाइल वाले ऐक्टिव पेजकैश के साथ वर्कलोड पर खराब परफ़ॉर्म करते थे. खराब परफ़ॉर्मेंस की वजह से, थ्रैशिंग हुई और कोई किल नहीं मिला.
- एलएमके कर्नल ड्राइवर, फ़्री-मेमोरी की सीमाओं पर निर्भर करता था. साथ ही, मेमोरी के इस्तेमाल के हिसाब से इसकी स्केलिंग नहीं होती थी.
- डिजाइन में बदलाव न किए जा सकने की वजह से, पार्टनर अक्सर ड्राइवर को अपनी ज़रूरत के हिसाब से बदलते थे, ताकि वह उनके डिवाइसों पर काम कर सके.
- एलएमके ड्राइवर, स्लैब श्रिंकर एपीआई से जुड़ा होता है. इसे टारगेट खोजने और उन्हें बंद करने जैसी मुश्किल कार्रवाइयों के लिए डिज़ाइन नहीं किया गया था. इस वजह से,
vmscanकी प्रोसेस धीमी हो गई.
Userspace lmkd
यूज़रस्पेस lmkd, कर्नल में मौजूद ड्राइवर की तरह ही काम करता है. हालांकि, यह मेमोरी के इस्तेमाल का पता लगाने और उसका अनुमान लगाने के लिए, कर्नल के मौजूदा तरीकों का इस्तेमाल करता है. इस तरह के मेकेनिज़्म में, कर्नल से जनरेट हुए vmpressure इवेंट या प्रेशर स्टॉल की जानकारी (पीएसआई) मॉनिटर का इस्तेमाल करके, मेमोरी के इस्तेमाल के लेवल के बारे में सूचनाएं पाना शामिल है. साथ ही, मेमोरी सीग्रुप की सुविधाओं का इस्तेमाल करके, प्रोसेस की अहमियत के आधार पर हर प्रोसेस को असाइन किए गए मेमोरी संसाधनों को सीमित करना भी शामिल है.
Android 10 में यूज़रस्पेस lmkd का इस्तेमाल करना
Android 9 और इसके बाद के वर्शन में, अगर कर्नल में मौजूद एलएमके ड्राइवर का पता नहीं चलता है, तो यूज़रस्पेस lmkd चालू हो जाता है. उपयोगकर्ता स्पेस lmkd को मेमोरी cgroup के लिए कर्नल सपोर्ट की ज़रूरत होती है. इसलिए, कर्नल को इन कॉन्फ़िगरेशन सेटिंग के साथ कंपाइल किया जाना चाहिए:
CONFIG_ANDROID_LOW_MEMORY_KILLER=n
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y
रणनीतियां खत्म करना
Userspace lmkd, vmpressure इवेंट या पीएसआई मॉनिटर के आधार पर, प्रोसेस बंद करने की रणनीतियों का इस्तेमाल करता है. साथ ही, यह उनकी गंभीरता और स्वैप यूटिलाइज़ेशन जैसे अन्य संकेतों का भी इस्तेमाल करता है. कम मेमोरी और बेहतरीन परफ़ॉर्मेंस वाले डिवाइसों के लिए, प्रोसेस बंद करने की रणनीतियां अलग-अलग होती हैं:
- कम मेमोरी वाले डिवाइसों पर, सिस्टम को मेमोरी पूरी तरह भरे होने की समस्या को सामान्य मोड में हल करना चाहिए.
- बेहतरीन परफ़ॉर्मेंस देने वाले डिवाइसों पर, मेमोरी पूरी तरह भरे होने की समस्या को असामान्य स्थिति के तौर पर देखा जाना चाहिए. साथ ही, इसे ठीक किया जाना चाहिए, ताकि यह डिवाइस की परफ़ॉर्मेंस पर असर न डाले.
ro.config.low_ram प्रॉपर्टी का इस्तेमाल करके, किल रणनीति को कॉन्फ़िगर किया जा सकता है.
Userspace lmkd में लेगसी मोड भी काम करता है. इसमें, कर्नेल में मौजूद LMK ड्राइवर की तरह ही रणनीतियों का इस्तेमाल करके प्रोसेस बंद करने का फ़ैसला लिया जाता है. जैसे, मेमोरी और फ़ाइल कैश के थ्रेशोल्ड. लेगसी मोड चालू करने के लिए, ro.lmk.use_minfree_levels प्रॉपर्टी को true पर सेट करें.
lmkd को कॉन्फ़िगर करना
इन प्रॉपर्टी का इस्तेमाल करके, किसी डिवाइस के लिए lmkd को कॉन्फ़िगर करें.
| प्रॉपर्टी | इस्तेमाल करें | डिफ़ॉल्ट |
|---|---|---|
ro.config.low_ram
|
यह तय करें कि डिवाइस में कम रैम है या वह हाई-परफ़ॉर्मेंस वाला डिवाइस है. | false
|
ro.lmk.use_psi |
vmpressure इवेंट के बजाय, PSI मॉनिटर का इस्तेमाल करें. |
true |
ro.lmk.use_minfree_levels
|
प्रोसेस को बंद करने के फ़ैसले लेने के लिए, खाली मेमोरी और फ़ाइल कैश थ्रेशोल्ड का इस्तेमाल करें. इसका मतलब है कि कर्नल में मौजूद LMK ड्राइवर की सुविधा से मेल खाएं. | false
|
ro.lmk.low
|
कम vmpressure लेवल पर बंद की जा सकने वाली प्रोसेस के लिए, कम से कम oom_adj स्कोर.
|
1001(बंद है) |
ro.lmk.medium
|
मीडियम vmpressure लेवल पर बंद की जा सकने वाली प्रोसेस के लिए, कम से कम oom_adj स्कोर.
|
800(कैश मेमोरी में सेव की गई या गैर-ज़रूरी सेवाएं) |
ro.lmk.critical
|
क्रिटिकल vmpressure लेवल पर बंद की जा सकने वाली प्रोसेस के लिए, कम से कम oom_adj स्कोर.
|
0(कोई भी प्रोसेस) |
ro.lmk.critical_upgrade
|
अपग्रेड को ज़रूरी लेवल पर सेट करने की सुविधा चालू करें. | false
|
ro.lmk.upgrade_pressure
|
सिस्टम बहुत ज़्यादा स्वैप कर रहा है, इसलिए लेवल को अपग्रेड करने के लिए ज़्यादा से ज़्यादा mem_pressure.
|
100(बंद है) |
ro.lmk.downgrade_pressure
|
mem_pressure की वह कम से कम वैल्यू जिस पर vmpressure इवेंट को अनदेखा कर दिया जाता है, क्योंकि अब भी ज़रूरत के मुताबिक मेमोरी उपलब्ध है.
|
100(बंद है) |
ro.lmk.kill_heaviest_task
|
सबसे ज़्यादा सीपीयू इस्तेमाल करने वाले टास्क को बंद करना (बेहतर फ़ैसला) बनाम किसी भी टास्क को बंद करना (जल्दी फ़ैसला). | false
|
ro.lmk.kill_timeout_ms
|
यह वह अवधि है जब किसी प्रोसेस को बंद करने के बाद, उसे फिर से शुरू नहीं किया जाएगा. यह अवधि मिलीसेकंड में होती है. | 0(बंद है) |
ro.lmk.debug
|
lmkd डीबग लॉग जनरेट करने की सुविधा चालू करें.
|
false
|
डिवाइस कॉन्फ़िगरेशन का उदाहरण:
PRODUCT_PROPERTY_OVERRIDES += \
ro.lmk.low=1001 \
ro.lmk.medium=800 \
ro.lmk.critical=0 \
ro.lmk.critical_upgrade=false \
ro.lmk.upgrade_pressure=100 \
ro.lmk.downgrade_pressure=100 \
ro.lmk.kill_heaviest_task=true
Android 11 में यूज़रस्पेस lmkd
Android 11, lmkd को बेहतर बनाता है. इसके लिए, यह नई किलिंग रणनीति का इस्तेमाल करता है. किलिंग की रणनीति, मेमोरी प्रेशर का पता लगाने के लिए पीएसआई मेकेनिज़्म का इस्तेमाल करती है. इसे Android 10 में पेश किया गया था. Android 11 में lmkd, मेमोरी के इस्तेमाल के लेवल और थ्रैशिंग के लिए ज़िम्मेदार होता है. इससे मेमोरी की कमी और परफ़ॉर्मेंस में गिरावट को रोका जा सकता है.
यह किलिंग की रणनीति, पिछली रणनीतियों की जगह लेती है. इसका इस्तेमाल, ज़्यादा परफ़ॉर्मेंस वाले और कम रैम (Android Go) वाले डिवाइसों, दोनों पर किया जा सकता है.
कर्नेल की ज़रूरी शर्तें
Android 11 वाले डिवाइसों के लिए, lmkd को कर्नल की इन सुविधाओं की ज़रूरत होती है:
- पीएसआई पैच शामिल करें और पीएसआई को चालू करें. बैकपोर्ट, Android के सामान्य कर्नल 4.9, 4.14, और 4.19 में उपलब्ध हैं.
- इसमें PIDFD के साथ काम करने वाले पैच शामिल हैं. ये Android के सामान्य कर्नल 4.9, 4.14, और 4.19 में उपलब्ध हैं.
- कम रैम वाले डिवाइसों के लिए, मेमोरी सीग्रुप शामिल करें.
कर्नेल को इन कॉन्फ़िगरेशन सेटिंग के साथ कंपाइल किया जाना चाहिए:
CONFIG_PSI=y
Android 11 में lmkd को कॉन्फ़िगर करना
Android 11 में मेमोरी किलिंग की रणनीति, यहां दिए गए ट्यूनिंग नॉब और डिफ़ॉल्ट के साथ काम करती है. ये सुविधाएं, ज़्यादा परफ़ॉर्मेंस और कम रैम वाले, दोनों तरह के डिवाइसों पर काम करती हैं.
| प्रॉपर्टी | इस्तेमाल करें | डिफ़ॉल्ट | |
|---|---|---|---|
| बेहतर परफ़ॉर्मेंस | कम रैम | ||
ro.lmk.psi_partial_stall_ms |
कम मेमोरी की सूचना ट्रिगर करने के लिए, मिलीसेकंड में आंशिक पीएसआई स्टॉल थ्रेशोल्ड. अगर डिवाइस को मेमोरी प्रेशर की सूचनाएं बहुत देर से मिलती हैं, तो इस वैल्यू को कम करें, ताकि सूचनाएं पहले मिल सकें. अगर मेमोरी पर ज़्यादा दबाव पड़ने की सूचनाएं बिना किसी वजह के ट्रिगर होती हैं, तो इस वैल्यू को बढ़ाएं, ताकि डिवाइस शोर के लिए कम संवेदनशील हो. | 70 |
200 |
ro.lmk.psi_complete_stall_ms |
यह थ्रेशोल्ड, मिलीसेकंड में होता है. यह पीएसआई के पूरी तरह से रुकने का थ्रेशोल्ड होता है. इससे मेमोरी से जुड़ी ज़रूरी सूचनाएं ट्रिगर होती हैं. अगर डिवाइस को मेमोरी से जुड़ी गंभीर समस्याओं की सूचनाएं बहुत देर से मिलती हैं, तो इस वैल्यू को कम करें, ताकि सूचनाएं पहले मिल सकें. अगर मेमोरी पर ज़्यादा दबाव पड़ने की सूचनाएं बिना किसी वजह के ट्रिगर होती हैं, तो इस वैल्यू को बढ़ाएं. इससे डिवाइस, नॉइज़ के प्रति कम संवेदनशील हो जाएगा. | 700 |
|
ro.lmk.thrashing_limit |
फ़ाइल के बैकअप वाले पेजकैश के कुल साइज़ के प्रतिशत के तौर पर, वर्किंगसेट रीफ़ॉल्ट की ज़्यादा से ज़्यादा संख्या. इस वैल्यू से ज़्यादा वर्कसेट रीफ़ॉल्ट का मतलब है कि सिस्टम, पेजकैश को थ्रैश कर रहा है. अगर मेमोरी पर दबाव पड़ने के दौरान डिवाइस की परफ़ॉर्मेंस पर असर पड़ता है, तो थ्रैशिंग को सीमित करने के लिए वैल्यू कम करें. अगर थ्रैशिंग की वजह से डिवाइस की परफ़ॉर्मेंस को बेवजह कम कर दिया जाता है, तो वैल्यू बढ़ाएं, ताकि थ्रैशिंग की अनुमति दी जा सके. | 100 |
30 |
ro.lmk.thrashing_limit_decay |
थ्रैशिंग थ्रेशोल्ड डेके को ओरिजनल थ्रेशोल्ड के प्रतिशत के तौर पर दिखाया जाता है. इसका इस्तेमाल तब किया जाता है, जब सिस्टम को बंद करने के बाद भी थ्रेशोल्ड कम नहीं होता है. अगर लगातार थ्रैशिंग से गैर-ज़रूरी किल्स होते हैं, तो वैल्यू कम करें. अगर प्रोसेस बंद होने के बाद, लगातार थ्रैशिंग का जवाब बहुत देर से मिलता है, तो वैल्यू बढ़ाएं. | 10 |
50 |
ro.lmk.swap_util_max |
स्वैप की गई मेमोरी की ज़्यादा से ज़्यादा मात्रा, स्वैप की जा सकने वाली कुल मेमोरी के प्रतिशत के तौर पर. जब स्वैप की गई मेमोरी इस सीमा से ज़्यादा हो जाती है, तो इसका मतलब है कि सिस्टम ने स्वैप की जा सकने वाली ज़्यादातर मेमोरी को स्वैप कर दिया है और अब भी उस पर दबाव है.
ऐसा तब हो सकता है, जब स्वैप नहीं किए जा सकने वाले ऐलोकेशन से मेमोरी पर दबाव पड़ रहा हो. इसे स्वैप करके कम नहीं किया जा सकता, क्योंकि स्वैप की जा सकने वाली ज़्यादातर मेमोरी पहले ही स्वैप की जा चुकी है. डिफ़ॉल्ट वैल्यू 100 होती है. इसका मतलब है कि यह जांच बंद है. अगर स्वैप मेमोरी का इस्तेमाल ज़्यादा होने की वजह से, डिवाइस की परफ़ॉर्मेंस पर असर पड़ रहा है और स्वैप मेमोरी का लेवल ro.lmk.swap_free_low_percentage तक नहीं गिर रहा है, तो स्वैप मेमोरी के इस्तेमाल को सीमित करने के लिए, वैल्यू कम करें. |
100 |
100 |
नीचे दिए गए पुराने ट्यूनिंग नॉब भी, नई किलिंग रणनीति के साथ काम करते हैं.
| प्रॉपर्टी | इस्तेमाल करें | डिफ़ॉल्ट | |
|---|---|---|---|
| बेहतर परफ़ॉर्मेंस | कम रैम | ||
ro.lmk.swap_free_low_percentage |
स्वैप स्पेस के प्रतिशत के तौर पर, मुफ़्त स्वैप का लेवल. `lmkd` इस वैल्यू का इस्तेमाल थ्रेशोल्ड के तौर पर करता है. इससे यह तय होता है कि सिस्टम को स्वैप स्पेस की ज़रूरत कब है. अगर स्वैप में बहुत ज़्यादा जगह होने पर `lmkd` प्रोसेस बंद हो जाती है, तो प्रतिशत कम करें. अगर `lmkd` प्रोसेस बहुत देर से बंद होती है और OOM प्रोसेस को बंद होने की अनुमति मिलती है, तो प्रतिशत बढ़ाएं. | 20 |
10 |
ro.lmk.debug |
इससे `lmkd` के डीबग लॉग जनरेट करने की सुविधा चालू होती है. ट्यूनिंग के दौरान डीबग करने की सुविधा चालू करें. | false |
|