Low memory killer daemon

Android का लो मेमोरी किलर डीमन (lmkd) प्रोसेस, चालू Android सिस्टम की मेमोरी की स्थिति पर नज़र रखती है. साथ ही, मेमोरी पर ज़्यादा दबाव पड़ने पर, सबसे कम ज़रूरी प्रोसेस को बंद कर देती है, ताकि सिस्टम ठीक से काम करता रहे.

मेमोरी प्रेशर के बारे में जानकारी

एक साथ कई प्रोसेस चलाने वाले Android सिस्टम में ऐसी स्थितियां आ सकती हैं, जब सिस्टम मेमोरी खत्म हो जाती है. साथ ही, ज़्यादा मेमोरी की ज़रूरत वाली प्रोसेस में देरी होती है. मेमोरी प्रेशर एक ऐसी स्थिति होती है जिसमें सिस्टम में मेमोरी कम हो जाती है. इस स्थिति में, Android को मेमोरी खाली करनी होती है, ताकि मेमोरी प्रेशर कम हो सके. इसके लिए, वह कम ज़रूरी प्रोसेस को थ्रॉटल या बंद कर देता है. साथ ही, प्रोसेस से अनुरोध करता है कि वे गैर-ज़रूरी कैश किए गए संसाधनों को खाली करें.

पहले, Android, सिस्टम मेमोरी पर पड़ने वाले दबाव की निगरानी करता था. इसके लिए, कर्नेल में मौजूद लो मेमोरी किलर (एलएमके) ड्राइवर का इस्तेमाल किया जाता था. यह एक ऐसा तरीका है जो हार्ड-कोड की गई वैल्यू पर निर्भर करता है. कर्नेल 4.12 से, एलएमके ड्राइवर को अपस्ट्रीम कर्नेल से हटा दिया गया है. साथ ही, यूज़रस्पेस lmkd, मेमोरी मॉनिटरिंग और प्रोसेस किलिंग के टास्क करता है.

प्रेशर स्टॉल की जानकारी

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

PSI मॉनिटर बनाम vmpressure सिग्नल

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

पीएसआई मॉनिटर का इस्तेमाल करना

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

इन-कर्नल एलएमके ड्राइवर की कमियां

Android, कई समस्याओं की वजह से LMK ड्राइवर को बंद कर देता है. इनमें ये समस्याएं शामिल हैं:

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

Userspace lmkd

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

Android 10 में यूज़रस्पेस lmkd का इस्तेमाल करना

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

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

कर्नेल से जुड़ी ज़रूरी शर्तें

Android 11 वाले डिवाइसों के लिए, lmkd को कर्नल की इन सुविधाओं की ज़रूरत होती है:

  • पीएसआई पैच शामिल करें और पीएसआई को चालू करें. Android के सामान्य कर्नल 4.9, 4.14, और 4.19 में बैकपोर्ट उपलब्ध हैं.
  • इसमें PIDFD की सुविधा के लिए ज़रूरी पैच शामिल हैं. ये पैच, Android के सामान्य कर्नल 4.9, 4.14, और 4.19 में उपलब्ध हैं.
  • कम रैम वाले डिवाइसों के लिए, मेमोरी सीग्रुप शामिल करें.

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

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