Android लो मेमोरी किलर डीमन (lmkd
) प्रोसेस, चल रहे Android सिस्टम की मेमोरी स्थिति को मॉनिटर करता है. साथ ही, यह सिस्टम को कम से कम ज़रूरी प्रोसेस को खत्म करके, ज़्यादा मेमोरी के दबाव पर प्रतिक्रिया देता है, ताकि सिस्टम सही लेवल पर परफ़ॉर्म करे.
मेमोरी प्रेशर के बारे में जानकारी
एक साथ कई प्रोसेस चलाने वाले Android सिस्टम में, ऐसी स्थितियां आ सकती हैं जब सिस्टम मेमोरी खत्म हो जाए और ज़्यादा मेमोरी की ज़रूरत वाली प्रोसेस में काफ़ी देरी हो. मेमोरी का दबाव, ऐसी स्थिति है जब सिस्टम में मेमोरी कम हो जाती है. इस दबाव को कम करने के लिए, Android को मेमोरी खाली करनी पड़ती है. इसके लिए, वह ग़ैर-ज़रूरी प्रोसेस को कम करता है या बंद कर देता है. साथ ही, प्रोसेस से कैश मेमोरी में सेव किए गए ऐसे संसाधनों को हटाने का अनुरोध करता है जो ज़रूरी नहीं हैं.
पहले, Android, इन-कर्नल कम मेमोरी किलर (LMK) ड्राइवर का इस्तेमाल करके, सिस्टम मेमोरी के दबाव को मॉनिटर करता था. यह एक सख्त तरीका है, जो हार्ड कोड की गई वैल्यू पर निर्भर करता है. कर्नेल 4.12 के बाद, LMK ड्राइवर को अपस्ट्रीम कर्नेल से हटा दिया गया है. साथ ही, उपयोगकर्ता स्पेस lmkd
, मेमोरी मॉनिटरिंग और प्रोसेस को बंद करने के टास्क करता है.
प्रेशर स्टॉल की जानकारी
Android 10 और इसके बाद के वर्शन में, lmkd
का एक नया मोड उपलब्ध है. यह मोड, मेमोरी के दबाव का पता लगाने के लिए, कर्नेल प्रेशर स्टॉल की जानकारी (पीएसआई) मॉनिटर का इस्तेमाल करता है. अपस्ट्रीम कर्नेल में मौजूद PSI पैचसेट (4.9 और 4.14 कर्नेल में बैकपोर्ट किया गया), यह मेज़र करता है कि मेमोरी की कमी की वजह से टास्क पूरा होने में कितना समय लग रहा है. इन देरी से सीधे तौर पर उपयोगकर्ता अनुभव पर असर पड़ता है. इसलिए, ये मेट्रिक, मेमोरी पर पड़ने वाले दबाव की गंभीरता का पता लगाने के लिए एक सुविधाजनक मेट्रिक हैं. अपस्ट्रीम कर्नेल में, PSI मॉनिटर भी शामिल होते हैं. इनकी मदद से, lmkd
जैसी खास सुविधाओं वाली यूज़रस्पेस प्रोसेस, इन देरी के लिए थ्रेशोल्ड तय कर सकती हैं. साथ ही, थ्रेशोल्ड का उल्लंघन होने पर, कर्नेल से इवेंट की सदस्यता ले सकती हैं.
PSI मॉनिटर बनाम vmpressure सिग्नल
vmpressure
सिग्नल (मेमोरी के दबाव का पता लगाने के लिए कर्नेल से जनरेट किए जाते हैं और lmkd
का इस्तेमाल करते हैं) में अक्सर कई गलत सकारात्मक नतीजे शामिल होते हैं. इसलिए, lmkd
को यह पता लगाने के लिए फ़िल्टर करना होगा कि मेमोरी पर असल में दबाव है या नहीं.
इसकी वजह से, ग़ैर-ज़रूरी lmkd
वेकअप और अन्य कंप्यूटेशनल रिसॉर्स का इस्तेमाल होने लगता है. पीएसआई मॉनिटर का इस्तेमाल करने से, मेमोरी पर दबाव का पता लगाने में ज़्यादा सटीक नतीजे मिलते हैं. साथ ही, फ़िल्टर करने में लगने वाला समय भी कम हो जाता है.
पीएसआई मॉनिटर का इस्तेमाल करना
vmpressure
इवेंट के बजाय पीएसआई मॉनिटर का इस्तेमाल करने के लिए, ro.lmk.use_psi
प्रॉपर्टी को कॉन्फ़िगर करें. डिफ़ॉल्ट तौर पर, यह true
होता है. इससे PSI, lmkd
के लिए, मेमोरी प्रैशर का पता लगाने के डिफ़ॉल्ट तरीके को मॉनिटर करता है. पीएसआई मॉनिटर के लिए, कर्नेल की सहायता ज़रूरी है. इसलिए, कर्नेल में पीएसआई के बैकपोर्ट पैच शामिल होने चाहिए और उसे पीएसआई की सहायता चालू (CONFIG_PSI=y
) के साथ कॉम्पाइल किया जाना चाहिए.
इन-कर्नल LMK ड्राइवर के नुकसान
Android, कई समस्याओं की वजह से LMK ड्राइवर का इस्तेमाल नहीं करता. इनमें ये समस्याएं भी शामिल हैं:
- कम रैम वाले डिवाइसों को ज़्यादा बेहतर बनाने के लिए, उनमें बदलाव करना पड़ता था. इसके बावजूद, वे बड़ी फ़ाइल के बैकअप वाले ऐक्टिव पेजकैश वाले वर्कलोड पर खराब परफ़ॉर्म करते थे. खराब परफ़ॉर्मेंस की वजह से, गेम में हार का सामना करना पड़ा और कोई भी हत्या नहीं की जा सकी.
- LMK कर्नेल ड्राइवर, खाली मेमोरी की सीमाओं पर निर्भर करता था. इसमें मेमोरी के दबाव के आधार पर स्केलिंग नहीं की जाती थी.
- डिज़ाइन की जटिलता की वजह से, पार्टनर अक्सर ड्राइवर को इस तरह से कस्टमाइज़ करते हैं कि यह उनके डिवाइसों पर काम करे.
- LMK ड्राइवर, स्लैब सिकुड़ाने वाले एपीआई से जुड़ा था. इसे टारगेट खोजने और उन्हें मारने जैसे भारी कामों के लिए डिज़ाइन नहीं किया गया था. इस वजह से,
vmscan
प्रोसेस धीमी हो गई.
Userspace lmkd
यूज़रस्पेस lmkd
, उसी फ़ंक्शन को लागू करता है जो इन-कर्नेल ड्राइवर
में लागू होता है. हालांकि, मेमोरी दबाव का पता लगाने और उसका अनुमान लगाने के लिए, मौजूदा कर्नेल मैकेनिज़्म का इस्तेमाल किया जाता है. इस तरह के तरीकों में, मेमोरी के दबाव के लेवल के बारे में सूचनाएं पाने के लिए, कर्नेल से जनरेट किए गए vmpressure
इवेंट या प्रेशर स्टॉल की जानकारी (पीएसआई) मॉनिटर का इस्तेमाल करना शामिल है. साथ ही, प्रोसेस की अहमियत के आधार पर, हर प्रोसेस के लिए मेमोरी संसाधनों को सीमित करने के लिए, मेमोरी cgroup की सुविधाओं का इस्तेमाल करना भी शामिल है.
Android 10 में userspace lmkd का इस्तेमाल करना
Android 9 और उसके बाद के वर्शन में, यूज़रस्पेस lmkd
तब चालू होता है, जब कोई इन-कर्नल LMK ड्राइवर नहीं मिलता. यूज़रस्पेस lmkd
को मेमोरी cgroups के लिए केरनेल की मदद की ज़रूरत होती है. इसलिए, केरनेल को इन कॉन्फ़िगरेशन सेटिंग के साथ कॉम्पाइल किया जाना चाहिए:
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 इवेंट के बजाय, पीएसआई मॉनिटर का इस्तेमाल करें. |
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 के लिए Userspace 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.
- कम रैम वाले डिवाइसों के लिए, मेमोरी cgroups शामिल करें.
कर्नेल को इन कॉन्फ़िगरेशन सेटिंग के साथ कंपाइल किया जाना चाहिए:
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 |
फ़ाइल से बैक किए गए पेजकैश के कुल साइज़ के प्रतिशत के तौर पर, वर्किंग सेट के रीफ़ॉल्ट की ज़्यादा से ज़्यादा संख्या. Workingset इस वैल्यू से ज़्यादा नहीं होने का मतलब है कि सिस्टम अपने पेजकैश को हैक कर रहा है. अगर मेमोरी के कम होने पर डिवाइस की परफ़ॉर्मेंस पर असर पड़ता है, तो ट्रैशिंग को सीमित करने के लिए वैल्यू कम करें. अगर थ्रैशिंग की वजह से डिवाइस की परफ़ॉर्मेंस बिना वजह ही खत्म हो जाए, तो ज़्यादा थ्रैशिंग करने के लिए वैल्यू बढ़ाएं. | 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 |