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 |