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

एंड्रॉइड लो मेमोरी किलर डेमॉन ( lmkd ) प्रक्रिया चल रहे एंड्रॉइड सिस्टम की मेमोरी स्थिति की निगरानी करती है और सिस्टम को स्वीकार्य स्तर पर प्रदर्शन करने के लिए कम से कम आवश्यक प्रक्रियाओं को मारकर उच्च मेमोरी दबाव पर प्रतिक्रिया करती है।

स्मृति दबाव के बारे में

एक एंड्रॉइड सिस्टम जो समानांतर में कई प्रक्रियाएं चला रहा है, उसे ऐसी स्थितियों का सामना करना पड़ सकता है जब सिस्टम मेमोरी समाप्त हो जाती है और जिन प्रक्रियाओं को अधिक मेमोरी की आवश्यकता होती है उनमें ध्यान देने योग्य देरी होती है। मेमोरी प्रेशर , एक ऐसी स्थिति जिसमें सिस्टम में मेमोरी की कमी हो जाती है, एंड्रॉइड को महत्वहीन प्रक्रियाओं को थ्रॉटल या मारकर मेमोरी मुक्त करने (दबाव को कम करने के लिए) की आवश्यकता होती है, गैर-महत्वपूर्ण कैश्ड संसाधनों को मुक्त करने के लिए प्रक्रियाओं का अनुरोध करना, इत्यादि।

ऐतिहासिक रूप से, एंड्रॉइड ने इन-कर्नेल लो मेमोरी किलर (एलएमके) ड्राइवर का उपयोग करके सिस्टम मेमोरी दबाव की निगरानी की, एक कठोर तंत्र जो हार्ड-कोडेड मानों पर निर्भर करता है। कर्नेल 4.12 के अनुसार, एलएमके ड्राइवर को अपस्ट्रीम कर्नेल से हटा दिया जाता है और यूजरस्पेस lmkd मेमोरी मॉनिटरिंग और प्रोसेस किलिंग कार्य करता है।

दबाव स्टाल जानकारी

एंड्रॉइड 10 और बाद में एक नए lmkd मोड का समर्थन करता है जो मेमोरी प्रेशर का पता लगाने के लिए कर्नेल प्रेशर स्टॉल सूचना (पीएसआई) मॉनिटर का उपयोग करता है। अपस्ट्रीम कर्नेल में पीएसआई पैचसेट (4.9 और 4.14 कर्नेल पर बैकपोर्ट किया गया) उस समय की मात्रा को मापता है जिसमें मेमोरी की कमी के परिणामस्वरूप कार्यों में देरी होती है। चूंकि ये देरी सीधे उपयोगकर्ता अनुभव को प्रभावित करती है, इसलिए वे मेमोरी दबाव की गंभीरता निर्धारित करने के लिए एक सुविधाजनक मीट्रिक का प्रतिनिधित्व करते हैं। अपस्ट्रीम कर्नेल में पीएसआई मॉनिटर भी शामिल हैं जो विशेषाधिकार प्राप्त उपयोगकर्ता स्थान प्रक्रियाओं (जैसे lmkd ) को इन देरी के लिए सीमाएँ निर्दिष्ट करने और सीमा का उल्लंघन होने पर कर्नेल से घटनाओं की सदस्यता लेने की अनुमति देते हैं।

पीएसआई मॉनिटर बनाम वीएमप्रेशर सिग्नल

चूँकि vmpressure सिग्नल (मेमोरी दबाव का पता लगाने के लिए कर्नेल द्वारा उत्पन्न और lmkd द्वारा उपयोग किया जाता है) में अक्सर कई गलत सकारात्मकताएँ शामिल होती हैं, lmkd यह निर्धारित करने के लिए फ़िल्टरिंग करनी चाहिए कि क्या मेमोरी वास्तविक दबाव में है। इसके परिणामस्वरूप अनावश्यक lmkd वेकअप और अतिरिक्त कम्प्यूटेशनल संसाधनों का उपयोग होता है। पीएसआई मॉनिटर का उपयोग करने से अधिक सटीक मेमोरी दबाव का पता चलता है और फ़िल्टरिंग ओवरहेड कम हो जाता है।

पीएसआई मॉनिटर का उपयोग करना

vmpressure इवेंट के बजाय PSI मॉनिटर का उपयोग करने के लिए, ro.lmk.use_psi प्रॉपर्टी को कॉन्फ़िगर करें। डिफ़ॉल्ट true है, जिससे PSI lmkd के लिए मेमोरी दबाव का पता लगाने के डिफ़ॉल्ट तंत्र की निगरानी करता है। क्योंकि PSI मॉनिटर को कर्नेल समर्थन की आवश्यकता होती है, कर्नेल में PSI बैकपोर्ट पैच शामिल होना चाहिए और PSI समर्थन सक्षम ( CONFIG_PSI=y ) के साथ संकलित होना चाहिए।

इन-कर्नेल LMK ड्राइवर की कमियाँ

एंड्रॉइड कई मुद्दों के कारण एलएमके ड्राइवर को बंद कर देता है, जिनमें शामिल हैं:

  • कम-रैम उपकरणों को आक्रामक तरीके से ट्यून करना पड़ता था, और तब भी बड़े फ़ाइल-समर्थित सक्रिय पेजकैश वाले वर्कलोड पर खराब प्रदर्शन करते थे। ख़राब प्रदर्शन के परिणामस्वरूप पिटाई हुई और कोई हत्या नहीं हुई।
  • एलएमके कर्नेल ड्राइवर फ्री-मेमोरी सीमा पर निर्भर था, जिसमें मेमोरी दबाव के आधार पर कोई स्केलिंग नहीं थी।
  • डिज़ाइन की कठोरता के कारण, साझेदार अक्सर ड्राइवर को अनुकूलित करते हैं ताकि यह उनके उपकरणों पर काम कर सके।
  • एलएमके ड्राइवर स्लैब श्रिंकर एपीआई से जुड़ गया, जिसे लक्ष्य की खोज करने और उन्हें मारने जैसे भारी ऑपरेशनों के लिए डिज़ाइन नहीं किया गया था, जिससे vmscan प्रक्रिया धीमी हो गई।

यूजरस्पेस एलएमकेडी

यूजरस्पेस lmkd इन-कर्नेल ड्राइवर के समान कार्यक्षमता लागू करता है लेकिन मेमोरी दबाव का पता लगाने और अनुमान लगाने के लिए मौजूदा कर्नेल तंत्र का उपयोग करता है। ऐसे तंत्रों में मेमोरी दबाव स्तरों के बारे में सूचनाएं प्राप्त करने के लिए कर्नेल-जनरेटेड vmpressure इवेंट या प्रेशर स्टॉल सूचना (पीएसआई) मॉनिटर का उपयोग करना और प्रक्रिया महत्व के आधार पर प्रत्येक प्रक्रिया को आवंटित मेमोरी संसाधनों को सीमित करने के लिए मेमोरी सीग्रुप सुविधाओं का उपयोग करना शामिल है।

एंड्रॉइड 10 में यूजरस्पेस एलएमकेडी का उपयोग करना

एंड्रॉइड 9 और उसके बाद के संस्करण में, यदि इन-कर्नेल एलएमके ड्राइवर का पता नहीं चलता है तो यूजरस्पेस lmkd सक्रिय हो जाता है। क्योंकि यूजरस्पेस lmkd मेमोरी सीग्रुप के लिए कर्नेल समर्थन की आवश्यकता होती है, कर्नेल को निम्नलिखित कॉन्फ़िगरेशन सेटिंग्स के साथ संकलित किया जाना चाहिए:

CONFIG_ANDROID_LOW_MEMORY_KILLER=n
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y

रणनीतियों को मार डालो

यूजरस्पेस lmkd vmpressure घटनाओं या पीएसआई मॉनिटर, उनकी गंभीरता और स्वैप उपयोग जैसे अन्य संकेतों के आधार पर किल रणनीतियों का समर्थन करता है। कम-मेमोरी और उच्च-प्रदर्शन वाले उपकरणों के बीच किल रणनीतियाँ भिन्न होती हैं:

  • कम मेमोरी वाले उपकरणों पर, सिस्टम को ऑपरेशन के सामान्य तरीके के रूप में उच्च मेमोरी दबाव को सहन करना चाहिए।
  • उच्च-प्रदर्शन वाले उपकरणों पर, मेमोरी दबाव को एक असामान्य स्थिति के रूप में देखा जाना चाहिए और समग्र प्रदर्शन को प्रभावित करने से पहले इसे ठीक किया जाना चाहिए।

आप ro.config.low_ram प्रॉपर्टी का उपयोग करके किल रणनीति को कॉन्फ़िगर कर सकते हैं। विवरण के लिए, निम्न रैम कॉन्फ़िगरेशन देखें।

यूजरस्पेस lmkd एक लीगेसी मोड का भी समर्थन करता है जिसमें यह इन-कर्नेल एलएमके ड्राइवर (यानी, मुफ्त मेमोरी और फ़ाइल कैश थ्रेशोल्ड) के समान रणनीतियों का उपयोग करके अंतिम निर्णय लेता है। लीगेसी मोड को सक्षम करने के लिए, ro.lmk.use_minfree_levels प्रॉपर्टी को true पर सेट करें।

एलएमकेडी को कॉन्फ़िगर करना

निम्नलिखित गुणों का उपयोग करके किसी विशिष्ट डिवाइस के लिए lmkd कॉन्फ़िगर करें।

संपत्ति उपयोग गलती करना
ro.config.low_ram निर्दिष्ट करें कि क्या डिवाइस कम-रैम या उच्च-प्रदर्शन वाला डिवाइस है। false
ro.lmk.use_psi पीएसआई मॉनिटर का उपयोग करें ( vmpressure घटनाओं के बजाय)। true
ro.lmk.use_minfree_levels प्रोसेस किल निर्णय लेने के लिए मुफ्त मेमोरी और फ़ाइल कैश थ्रेशोल्ड का उपयोग करें (अर्थात, इन-कर्नेल एलएमके ड्राइवर की कार्यक्षमता से मेल करें)। 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 किसी भी योग्य कार्य (त्वरित निर्णय) की तुलना में सबसे भारी योग्य कार्य (सर्वोत्तम निर्णय) को समाप्त करें। 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

एंड्रॉइड 11 में यूजरस्पेस एलएमकेडी

एंड्रॉइड 11 एक नई हत्या रणनीति पेश करके lmkd में सुधार करता है। हत्या की रणनीति एंड्रॉइड 10 में शुरू की गई मेमोरी दबाव का पता लगाने के लिए एक पीएसआई तंत्र का उपयोग करती है। एंड्रॉइड 11 में lmkd मेमोरी संसाधन उपयोग के स्तर और मेमोरी भुखमरी और प्रदर्शन में गिरावट को रोकने के लिए थ्रैशिंग को ध्यान में रखता है। यह हत्या की रणनीति पिछली रणनीतियों की जगह लेती है और इसका उपयोग उच्च-प्रदर्शन और कम-रैम (एंड्रॉइड गो) दोनों उपकरणों पर किया जा सकता है।

कर्नेल आवश्यकताएँ

Android 11 उपकरणों के लिए, lmkd निम्नलिखित कर्नेल सुविधाओं की आवश्यकता है:

  • पीएसआई पैच शामिल करें और पीएसआई सक्षम करें (एंड्रॉइड सामान्य कर्नेल 4.9, 4.14 और 4.19 में उपलब्ध बैकपोर्ट)।
  • PIDFD समर्थन पैच शामिल करें (एंड्रॉइड सामान्य कर्नेल 4.9, 4.14 और 4.19 में उपलब्ध बैकपोर्ट)।
  • कम रैम वाले उपकरणों के लिए, मेमोरी सीग्रुप शामिल करें।

कर्नेल को निम्नलिखित कॉन्फ़िगरेशन सेटिंग्स के साथ संकलित किया जाना चाहिए:

CONFIG_PSI=y

एंड्रॉइड 11 में एलएमकेडी को कॉन्फ़िगर करना

एंड्रॉइड 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