एंड्रॉइड लो मेमोरी किलर डेमॉन ( 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 |