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

संग्रह की मदद से व्यवस्थित रहें अपनी प्राथमिकताओं के आधार पर, कॉन्टेंट को सेव करें और कैटगरी में बांटें.

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