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