लो मेमोरी किलर डीमन

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) के साथ कॉम्पाइल किया जाना चाहिए.

इन-कर्नल एलएमके ड्राइवर के नुकसान

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 को बेहतर बनाया गया है. ऐप्लिकेशन को बंद करने की रणनीति, मेमोरी के दबाव का पता लगाने के लिए, PSI मशीन का इस्तेमाल करती है. इसे Android 10 में लॉन्च किया गया था. Android 11 में lmkd, मेमोरी संसाधन के इस्तेमाल के लेवल और थ्रैशिंग के लिए ज़रूरी है. इससे, मेमोरी की कमी और परफ़ॉर्मेंस में गिरावट को रोका जा सकता है. ऐप्लिकेशन बंद करने की यह रणनीति, पिछली रणनीतियों की जगह लेगी. इसका इस्तेमाल, बेहतर परफ़ॉर्मेंस वाले और कम रैम (Android Go) वाले, दोनों डिवाइसों पर किया जा सकता है.

Kernel से जुड़ी ज़रूरी शर्तें

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