Android लो मेमोरी किलर डीमन (lmkd
) प्रोसेस, मेमोरी की निगरानी करती है
मौजूदा स्थिति में, सिस्टम को
सबसे कम ज़रूरी प्रोसेस, जिनकी मदद से सिस्टम सही तरीके से परफ़ॉर्म करता रहे
लेवल.
मेमोरी दबाव के बारे में जानकारी
साथ-साथ कई प्रोसेस चला रहे Android सिस्टम को ऐसी स्थितियां जब सिस्टम की मेमोरी खत्म हो जाती है और ऐसी प्रोसेस होती हैं जिनमें ज़्यादा स्टोरेज की ज़रूरत होती है याददाश्त मिलने में ज़्यादा समय लग सकता है. मेमोरी दबाव, वह स्थिति जिसमें सिस्टम की मेमोरी कम है, इसे कम करने के लिए Android को मेमोरी खाली करनी होगी दबाव) बनाने के लिए, गै़र-ज़रूरी प्रोसेस को दबा दिया जाता है या उन्हें खत्म कर दिया जाता है. गैर-ज़रूरी कैश मेमोरी को खाली करने की प्रोसेस वगैरह.
अब तक, Android एक इन-कर्नेल का इस्तेमाल करके सिस्टम की मेमोरी के दबाव को मॉनिटर करता था
लो मेमोरी किलर (एलएमके) ड्राइवर. यह एक सख्त सिस्टम है, जो हार्ड कोड किए गए सॉफ़्टवेयर पर निर्भर करता है
वैल्यू. कर्नेल 4.12 के बाद, LMK ड्राइवर को अपस्ट्रीम से हटा दिया गया है
कर्नेल और यूज़रस्पेस lmkd
, मेमोरी की निगरानी करता है और उसे प्रोसेस करता है
टास्क.
प्रेशर स्टॉल की जानकारी
Android 10 और उसके बाद के वर्शन पर, नया lmkd
मोड काम करता है.
मेमोरी दबाव के लिए कर्नेल दबाव स्टॉल जानकारी (पीएसआई) मॉनिटर का इस्तेमाल करता है
पता लगाया जा सकता है. अपस्ट्रीम कर्नेल में PSI पैचसेट (4.9 और 4.14 पर बैकपोर्ट किया गया)
कर्नेल) से पता चलता है कि किसी टास्क को
मेमोरी की कमी. इस देरी की वजह से उपयोगकर्ता अनुभव पर सीधा असर पड़ता है.
मेमोरी दबाव की गंभीरता तय करने के लिए एक सुविधाजनक मेट्रिक दिखाती है. कॉन्टेंट बनाने
अपस्ट्रीम कर्नेल में ऐसे PSI मॉनिटर भी शामिल हैं, जो खास अधिकार रखने वाले यूज़रस्पेस को अनुमति देते हैं
(जैसे कि lmkd
) प्रोसेस के दौरान, इन देरी के लिए थ्रेशोल्ड तय करती हैं और
थ्रेशोल्ड पार होने पर, कर्नेल से इवेंट की सदस्यता लेता है.
पीएसआई मॉनिटर बनाम वीएमप्रेशर सिग्नल
क्योंकि vmpressure
सिग्नल (मेमोरी के लिए कर्नेल से जनरेट किया गया
प्रेशर का पता लगाने की सुविधा और lmkd
इसका इस्तेमाल करता है) में अक्सर कई फ़ॉल्स पॉज़िटिव शामिल होते हैं.
lmkd
को यह पता लगाने के लिए फ़िल्टर करना होगा कि मेमोरी पर असल में दबाव है या नहीं.
इससे ग़ैर-ज़रूरी lmkd
वेकअप और अतिरिक्त गड़बड़ियों का इस्तेमाल होता है
कंप्यूटेशनल रिसॉर्सेज़. पीएसआई मॉनिटर का इस्तेमाल करने पर, ज़्यादा सटीक मेमोरी मिलती है
प्रेशर का पता लगाने की सुविधा और ओवरहेड फ़िल्टर करने की प्रोसेस को कम करता है.
पीएसआई मॉनिटर इस्तेमाल करना
vmpressure
इवेंट के बजाय, पीएसआई मॉनिटर का इस्तेमाल करने के लिए,
ro.lmk.use_psi
प्रॉपर्टी. यह डिफ़ॉल्ट वैल्यू true
होती है. इससे पीएसआई,
lmkd
के लिए मेमोरी दबाव का पता लगाने का डिफ़ॉल्ट तरीका. क्योंकि पीएसआई मॉनिटर करता है
कर्नेल के सपोर्ट की ज़रूरत होती है, तो कर्नेल में PSI बैकपोर्ट पैच शामिल होने चाहिए और
PSI समर्थन सक्षम (CONFIG_PSI=y
) के साथ कंपाइल किया गया.
इन-कर्नेल LMK ड्राइवर के कमियां
Android, कई समस्याओं की वजह से एलएमके ड्राइवर का इस्तेमाल बंद कर देता है. इनमें ये समस्याएं शामिल हैं:
- कम रैम वाले डिवाइसों को बहुत ध्यान से ट्यून करना पड़ता था और तब भी बड़ी फ़ाइल-बैक्ड सक्रिय पेजकैश वाले वर्कलोड पर खराब प्रदर्शन करते हैं. कॉन्टेंट बनाने खराब परफ़ॉर्मेंस की वजह से ज़बरदस्ती मार थी और किसी की मौत नहीं हुई.
- LMK कर्नेल ड्राइवर ने बिना स्केलिंग के, फ़्री-मेमोरी सीमाओं पर भरोसा किया के हिसाब से तापमान में बदलाव किया जा सकता है.
- डिज़ाइन की जटिलता की वजह से, पार्टनर अक्सर ड्राइवर को पसंद के मुताबिक बनाते हैं ताकि यह उनके डिवाइस पर काम कर सके.
- एलएमके ड्राइवर ने स्लैब श्रिंकर एपीआई से कनेक्ट किया, जो
इसे बड़े पैमाने पर की जाने वाली कार्रवाइयों के लिए डिज़ाइन किया गया है. जैसे, लक्ष्यों को खोजना और उन्हें मारना
इससे
vmscan
की प्रोसेस धीमी हो गई है.
यूज़रस्पेस एलएमकेडी
यूज़रस्पेस lmkd
, उसी फ़ंक्शन को लागू करता है जो इन-कर्नेल ड्राइवर में लागू होता है
हालांकि, यह मेमोरी दबाव का पता लगाने और उसका अनुमान लगाने के लिए, मौजूदा कर्नेल मैकेनिज़्म का इस्तेमाल करता है. इस तरह
इन मैकेनिज़्म में कर्नेल से जनरेट किए गए vmpressure
इवेंट या प्रेशर स्टॉल का इस्तेमाल शामिल होता है
सूचना (पीएसआई), मेमोरी दबाव के लेवल के बारे में सूचनाएं पाने के लिए मॉनिटर करती है,
इसके अलावा, हर ग्रुप के लिए असाइन किए गए मेमोरी रिसॉर्स को सीमित करने के लिए, मेमोरी ग्रुप की सुविधाओं का इस्तेमाल किया जा सकता है
प्रक्रिया की अहमियत के आधार पर तैयार किया जाता है.
Android 10 में यूज़रस्पेस lmkd इस्तेमाल करना
Android 9 और उसके बाद वाले वर्शन में, यूज़रस्पेस lmkd
चालू हो जाता है, अगर
इन-कर्नेल LMK ड्राइवर नहीं मिला. क्योंकि यूज़रस्पेस lmkd
मेमोरी cग्रुप के लिए कर्नेल सपोर्ट की ज़रूरत है, कर्नेल को
कॉन्फ़िगरेशन सेटिंग देखें:
CONFIG_ANDROID_LOW_MEMORY_KILLER=n
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y
रणनीतियाँ खत्म करें
Userspace lmkd
, vmpressure
इवेंट या PSI के आधार पर खत्म करने की रणनीतियों के साथ काम करता है
मॉनिटर, उनकी गंभीरता, और अन्य संकेत, जैसे कि स्वैप करने की सुविधा का इस्तेमाल करने के बारे में बताया गया है. बंद करें
कम मेमोरी और ज़्यादा परफ़ॉर्मेंस वाले डिवाइस के लिए रणनीतियां अलग-अलग होती हैं:
- कम मेमोरी वाले डिवाइसों पर, सिस्टम को ज़्यादा मेमोरी के दबाव को इस तरह सहन करना चाहिए: काम करने का सामान्य मोड.
- बेहतरीन परफ़ॉर्मेंस वाले डिवाइसों पर, मेमोरी दबाव को असामान्य के तौर पर देखा जाना चाहिए समस्या को हल किया गया है और इससे पहले कि वह पूरी परफ़ॉर्मेंस पर असर डाले.
ro.config.low_ram
प्रॉपर्टी का इस्तेमाल करके, बंद करने की रणनीति को कॉन्फ़िगर किया जा सकता है. इसके लिए
विवरण, कम रैम देखें
कॉन्फ़िगरेशन.
Userspace lmkd
, लेगसी मोड के साथ भी काम करता है, जिसमें यह बंद करने के फ़ैसले लेता है
कर्नेल LMK ड्राइवर (जो बिना किसी शुल्क के उपलब्ध है) जैसी रणनीतियों का इस्तेमाल करता है
और फ़ाइल की कैश मेमोरी का थ्रेशोल्ड). लेगसी मोड को चालू करने के लिए,
true
के लिए ro.lmk.use_minfree_levels
प्रॉपर्टी.
lmkd कॉन्फ़िगर करें
इन प्रॉपर्टी का इस्तेमाल करके, किसी डिवाइस के लिए lmkd
को कॉन्फ़िगर करें.
प्रॉपर्टी | इस्तेमाल करें | डिफ़ॉल्ट |
---|---|---|
ro.config.low_ram
|
बताएं कि डिवाइस कम रैम है या बेहतर परफ़ॉर्मेंस वाला डिवाइस. | false
|
ro.lmk.use_psi |
vmpressure इवेंट के बजाय, पीएसआई मॉनिटर का इस्तेमाल करें. |
true |
ro.lmk.use_minfree_levels
|
प्रोसेस खत्म करने के लिए, खाली मेमोरी और फ़ाइल कैश थ्रेशोल्ड का इस्तेमाल करें फ़ैसले (इसका मतलब है कि वे इन-कर्नेल की सुविधाओं से मेल खाते हों एलएमके ड्राइवर). | false
|
ro.lmk.low
|
इन प्रोसेस में शामिल होने की ज़रूरी शर्तें पूरी करने के लिए, कम से कम oom_adj स्कोर
कम vmpressure स्तर पर मारा गया.
|
1001 (बंद है) |
ro.lmk.medium
|
इन प्रोसेस में शामिल होने की ज़रूरी शर्तें पूरी करने के लिए, कम से कम oom_adj स्कोर
मीडियम vmpressure लेवल पर मारा गया.
|
800 (कैश मेमोरी में सेव की गई या ग़ैर-ज़रूरी सेवाएं) |
ro.lmk.critical
|
इन प्रोसेस में शामिल होने की ज़रूरी शर्तें पूरी करने के लिए, कम से कम oom_adj स्कोर
गंभीर vmpressure स्तर पर मारा गया.
|
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
|
ज़रूरी शर्तें पूरी करने वाले किसी भी टास्क के मुकाबले, सबसे मुश्किल टास्क को खत्म करना है (सबसे अच्छा फ़ैसला लेना) (तेज़ फ़ैसला). | true
|
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 में उपलब्ध कराया गया. lmkd
इंच
Android 11 में, मेमोरी संसाधन के इस्तेमाल के लेवल तय करने में मदद मिलती है
और थ्रैशिंग का इस्तेमाल करके मेमोरी की कमी और परफ़ॉर्मेंस में गिरावट से बचा जा सकता है.
नुकसान पहुंचाने की यह रणनीति पिछली रणनीतियों की जगह ले रही है और इसका इस्तेमाल दोनों रणनीतियों के लिए किया जा सकता है
अच्छी परफ़ॉर्मेंस और कम रैम वाले (Android Go) डिवाइस.
कर्नेल के लिए ज़रूरी शर्तें
Android 11 डिवाइसों के लिए, lmkd
को कर्नेल के लिए ये सुविधाएं चाहिए:
- PSI पैच शामिल करें और PSI चालू करें (बैकपोर्ट इसमें उपलब्ध है Android के वर्शन 4.9, 4.14, और 4.19).
- पीआईडीएफ़डी सपोर्ट पैच शामिल करें (Android के उपयोगकर्ताओं के लिए उपलब्ध बैकपोर्ट) कर्नेल 4.9, 4.14, और 4.19).
- कम रैम वाले डिवाइसों के लिए, मेमोरी ग्रुप शामिल करें.
कर्नेल को नीचे दी गई कॉन्फ़िगरेशन सेटिंग के साथ कंपाइल किया जाना चाहिए:
CONFIG_PSI=y
Android 11 के लिए lmkd को कॉन्फ़िगर करें
Android 11 में इस्तेमाल की जा सकने वाली मेमोरी किलिंग रणनीति ट्यूनिंग नॉब और डिफ़ॉल्ट नीचे दिए गए हैं. ये सुविधाएं दोनों पर काम करती हैं अच्छी परफ़ॉर्मेंस और कम रैम वाले डिवाइस.
प्रॉपर्टी | इस्तेमाल करें | डिफ़ॉल्ट | |
---|---|---|---|
बेहतर परफ़ॉर्मेंस | कम रैम | ||
ro.lmk.psi_partial_stall_ms |
मिलीसेकंड में, आंशिक PSI स्टॉल की सीमा, कम ट्रिगर करने के लिए मेमोरी की सूचना. डिवाइस को मेमोरी दबाव की सूचनाएं मिलने पर बहुत देर हो गई है, तो पिछली सूचनाएं ट्रिगर करने के लिए इस मान को घटाएं. अगर मेमोरी दबाव की सूचनाएँ ग़ैर-ज़रूरी तौर पर ट्रिगर होती हैं. इसलिए, इतनी वैल्यू बढ़ाएं शोर-शराबे के प्रति कम संवेदनशील. | 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` बहुत देर से मारता है, तो ओओएम को अनुमति मिलती है इतना ही नहीं, इसका प्रतिशत बढ़ाने में भी मदद मिलती है. | 20 |
10 |
ro.lmk.debug |
यह `lmkd` डीबग लॉग को चालू करता है. ट्यून करते समय डीबग चालू करें. | false |