Android 17 और इसके बाद के वर्शन में, मेमोरी मैनेजमेंट डीमन (mmd) काम करता है. यह एक सिस्टम डीमन है. यह डीमन कॉन्फ़िगरेशन, ट्यून किए जा सकने वाले पैरामीटर, और स्वैप या ZRAM रखरखाव के चालू टास्क को मैनेज करता है.
बैकग्राउंड
mmd के आने से पहले, Android के ZRAM कॉन्फ़िगरेशन अलग-अलग थे और उनमें सीमित तौर पर बदलाव किया जा सकता था. mmd इस समस्या को हल करता है. इसके लिए, यह ZRAM मैनेजमेंट को एक जगह पर इकट्ठा करता है. साथ ही, कॉन्फ़िगरेशन के ज़्यादा बेहतर लॉजिक को चालू करता है. इसके अलावा, नई सुविधाओं को जोड़ने और आर्किटेक्चर में सुधार करने की प्रोसेस को आसान बनाता है.
mmd, Java पर आधारित system_server प्रोसेस और कर्नल-लेवल स्वैप या मेमोरी मैनेजमेंट के बीच अंतर को भी साफ़ तौर पर दिखाता है.
आर्किटेक्चर और ZRAM मैनेजमेंट
बूट पूरा होने पर (यानी कि जब sys.boot_completed=1), mmd_setup तय किए गए पैरामीटर के साथ ZRAM को कॉन्फ़िगर करने की कोशिश करता है. ZRAM का सेटअप पूरा होने के बाद, सिस्टम mmd सेवा को चालू करता है. यह सेवा, रखरखाव से जुड़े टास्क मैनेज करती है.
mmd प्रोजेक्ट में, रखरखाव से जुड़ी कार्रवाइयां system_server से शुरू की जाती हैं. इसके लिए, IMmd इंटरफ़ेस का इस्तेमाल करके, mmd को Binder अनुरोध भेजे जाते हैं.
mmd, ZRAM राइटबैक, फिर से कंप्रेस करने, और हर प्रोसेस के हिसाब से राइटबैक करने जैसे रखरखाव के टास्क को मैनेज करता है. यह काम, वह अपनी इंटरनल नीति इंजन के आधार पर करता है. सिस्टम प्रॉपर्टी का इस्तेमाल करके, ActivityManagerService से शेड्यूल करने और ZRAM रखरखाव की नीतियों, दोनों को कॉन्फ़िगर किया जा सकता है.
सिस्टम सर्वर इंटिग्रेशन (system_server)
Java पर आधारित system_server प्रोसेस यह तय करती है कि mmd को कब शुरू किया जाए. इस प्रोसेस में, ग्लोबल मेंटेनेंस स्वीप को ऐप्लिकेशन के हिसाब से टारगेट की गई मेमोरी ऑप्टिमाइज़ेशन से अलग किया जाता है.
प्रोसेस होने के बाद सामान्य रखरखाव
ActivityManagerService, com.android.server.memory.ZramMaintenance का इस्तेमाल करके ग्लोबल ZRAM को मैनेज करता है.

पहली इमेज. ZRAM के रखरखाव को शेड्यूल करने का फ़्लो.
- शेड्यूलिंग इंजन:
ZramMaintenance, Android केJobSchedulerके साथ समय-समय पर बैकग्राउंड में होने वाले जॉब को रजिस्टर करता है. - जॉब से जुड़ी शर्तें: फ़ोरग्राउंड यूज़र इंटरफ़ेस (यूआई) के रुक-रुक कर चलने या सीपीयू के इस्तेमाल में रुकावट आने से रोकने के लिए, जॉब को
setRequiresDeviceIdle(true)औरsetRequiresBatteryNotLow(true)के साथ साफ़ तौर पर कॉन्फ़िगर किया जाता है. - बाइंडर ट्रिगर करना: जब शेड्यूलर ट्रिगर होता है
onStartJob(), तोsystem_server,mmd.doZramMaintenanceAsync()को शुरू करता है. यह एकतरफ़ा एसिंक्रोनस बाइंडर कॉल है;system_server, रखरखाव के लिए किए जाने वाले स्वीप के पूरा होने का इंतज़ार नहीं करता.mmdइसे बैकग्राउंड वर्कर थ्रेड में जोड़ता है, ताकि क्रम से फिर से कंप्रेस किया जा सके और लिखा जा सके.
हर प्रोसेस के लिए राइटबैक
हर प्रोसेस के हिसाब से मेमोरी खाली करने की सुविधा को ActivityManagerService मैनेज करता है. इसके लिए, वह com.android.server.am.CachedAppOptimizer का इस्तेमाल करता है.

दूसरी इमेज. हर प्रोसेस के लिए, mmd पर-प्रोसेस राइटबैक फ़्लो.
जब कोई प्रोसेस, बैकग्राउंड में कैश की गई स्थिति में ट्रांज़िशन करती है, तो ActivityManager मेमोरी को कंपैक्ट करता है. अगर प्रोसेस को कम मेमोरी की वजह से बंद करने की सूचना उपयोगकर्ता को दिखेगी, तो इसका मतलब है कि प्रोसेस, गतिविधि को होस्ट करती है. अगर हर प्रोसेस के लिए ZRAM राइटबैक, प्रोसेस के मेमोरी फ़ुटप्रिंट को शून्य के करीब ले जाएगा, तो सिस्टम यह तरीका अपनाता है:
- कंपैक्शन के बाद,
CachedAppOptimizerअपने इंटरनल कंपैक्शन हैंडलर को कुछ समय बाद एक मैसेज (ZRAM_WRITEBACK_MSG) भेजता है. इसमेंmZramWritebackWaitSecondsकी देरी होती है. - समयसीमा खत्म होने पर, ActivityManager एक सुरक्षित प्रोसेस फ़ाइल
डिसक्रिप्टर
pidfdखोलता है. - सिस्टम सर्वर,
mmd.asyncWritebackProcessZramMemory(pfd, callback)को कॉल करता है. mmd, हर प्रोसेस के लिए writeback ioctl को एक्ज़ीक्यूट करता है औरIMmdProcessWritebackCallbackका इस्तेमाल करके वापस रिपोर्ट करता है. अगर प्रोसेस पूरी हो जाती है, तो ActivityManager, प्रोसेस रिकॉर्ड (setIsZramWrittenBack(app, true)) को फ़्लैग करता है, ताकि प्रोसेस कीoom_score_adjको बढ़ाया जा सके. साथ ही,FrameworkStatsLog.ZRAM_WRITEBACK_EVENTमें मेट्रिक लॉग करता है.
हर प्रोसेस के हिसाब से प्रीफ़ेच करने की सुविधा
जब कोई उपयोगकर्ता, पहले से कैश किए गए किसी ऐप्लिकेशन को फिर से लॉन्च करता है (UNFREEZE_REASON_ACTIVITY की वजह से अनफ़्रीज़ किया गया), तो ActivityManager, बैकअप स्टोरेज से होने वाली मुख्य पेज की गड़बड़ियों की वजह से ऐप्लिकेशन के स्टार्टअप में होने वाली देरी को कम करता है:
CachedAppOptimizer, अनफ़्रीज़ इवेंट को इंटरसेप्ट करता है औरprefetchZram(app)को शुरू करता है.- सिस्टम सर्वर, ऐप्लिकेशन के
pidfdको Binder के ज़रिएmmd.asyncPrefetchProcessZramMemory(pfd)का इस्तेमाल करके भेजता है.mmd,ZRAM_ANDROID_IOC_PROCESS_PREFETCHioctl जारी करता है. इससे कर्नल को यह निर्देश मिलता है कि ऐप्लिकेशन के मुख्य यूज़र इंटरफ़ेस (यूआई) थ्रेड के शुरू होने के दौरान, स्वैप किए गए पेजों को एसिंक्रोनस तरीके से वापस रैम में प्रीफ़ेच किया जाए.
रखरखाव और पोस्ट-प्रोसेसिंग के टास्क के बारे में खास जानकारी
इस सेक्शन में, बैकग्राउंड में रखरखाव से जुड़ी कार्रवाइयों और पोस्ट-प्रोसेसिंग टास्क के बारे में बताया गया है. mmd इन कार्रवाइयों और टास्क को स्वैप स्पेस और सिस्टम मेमोरी को ऑप्टिमाइज़ करने के लिए करता है.
mmd में रखरखाव
mmd में, मेंटेनेंस का मतलब, शेड्यूल की गई बैकग्राउंड में होने वाली मेंटेनेंस से है. इससे स्वैप स्पेस और फ़िज़िकल मेमोरी के इस्तेमाल को ऑप्टिमाइज़ किया जाता है. साथ ही, इससे ऐक्टिव उपयोगकर्ता की फ़ोरग्राउंड परफ़ॉर्मेंस पर कोई असर नहीं पड़ता. लगातार और एक साथ होने वाले स्वीप (जिससे सीपीयू का इस्तेमाल बहुत ज़्यादा होता है और यूज़र इंटरफ़ेस (यूआई) में रुकावट आती है) करने के बजाय, रखरखाव एसिंक्रोनस तरीके से किया जाता है:
system_server, Binder में समय-समय परdoZramMaintenanceAsync()को ट्रिगर करता है.mmdअनुरोध को बैकग्राउंड वर्क क्यूLowPrioWorkItem::ZramMaintenanceमें रखता है.mmdमें एक ही वर्कर थ्रेड होता है, जो ज़्यादा प्राथमिकता वाली और कम प्राथमिकता वाली, दोनों कतारों को मैनेज करता है. ज़्यादा प्राथमिकता वाले वर्क आइटम (जैसे, हर प्रोसेस के लिए प्रीफ़ेच) को पहले प्रोसेस किया जाता है. साथ ही, ये कम प्राथमिकता वाले वर्क आइटम को रोक सकते हैं. रखरखाव और हर प्रोसेस के लिए राइटबैक, कम प्राथमिकता वाले वर्क आइटम के तौर पर काम करते हैं. पॉप होने पर, वर्कर थ्रेड क्रम से रखरखाव से जुड़ी दो मुख्य कार्रवाइयां करता है:ZRAM रीकंप्रेशन: यह मौजूदा स्वैप पेजों को स्कैन करता है. साथ ही, ज़्यादा अनुपात वाले सेकंडरी कंप्रेशन एल्गोरिदम का इस्तेमाल करके, कुछ समय से इस्तेमाल में नहीं है पेजों को फिर से कंप्रेस करता है. उदाहरण के लिए,
zstd.ज़ेडआरएएम राइटबैक: यह सुविधा, इस्तेमाल न किए जा रहे पेजों को स्कैन करती है और उन्हें रैम से पूरी तरह हटा देती है. इसके बाद, उन्हें
/dataपर मौजूद किसी फ़ाइल से लूप डिवाइस के तौर पर बैकअप फ़्लैश स्टोरेज में सेव कर देती है.
ज़ेडआरएएम में पोस्ट-प्रोसेसिंग के टास्क
Linux कर्नल के ZRAM मॉड्यूल और mmd आर्किटेक्चर में, पोस्ट-प्रोसेसिंग के टास्क ऐसे एसिंक्रोनस ट्रांसफ़ॉर्मेशन होते हैं जो मेमोरी पेजों पर तब लागू होते हैं, जब उन्हें कर्नल के स्टैंडर्ड रीक्लेम पाथ (kswapd या कंपैक्शन) से पहले ही स्वैप आउट कर दिया गया हो.
जब किसी पेज को पहली बार स्वैप किया जाता है, तो सिस्टम स्पीड को प्राथमिकता देता है: यह तेज़ प्राइमरी कंप्रेशन एल्गोरिदम (जैसे कि lz4) का इस्तेमाल करता है और कंप्रेस किए गए पेज को रैम में सेव करता है. हालांकि, समय के साथ, स्वैप किए गए कई पेज ठंडे या कुछ समय से इस्तेमाल में नहीं हैं. उदाहरण के लिए, बैकग्राउंड में कैश मेमोरी में सेव किए गए ऐसे ऐप्लिकेशन जिन्हें कई घंटों तक फिर से शुरू नहीं किया जाता. ठंडे पेजों को तेज़ी से और कम कंप्रेस किए गए ZRAM में छोड़ने से, सिस्टम की परफ़ॉर्मेंस पर बुरा असर पड़ता है.
पोस्ट-प्रोसेसिंग पाइपलाइन
mmd इन पेजों को ऑप्टिमाइज़ करने के लिए, पोस्ट-प्रोसेसिंग के अलग-अलग लेवल वाला लाइफ़साइकल लागू करता है:

तीसरी इमेज. mmd पेज लाइफ़साइकल.
पहला चरण: शुरुआती स्वैप-आउट (तेज़ कंप्रेस): मेमोरी को सबसे पहले kswapd या ऐप्लिकेशन कंपैक्शन के ज़रिए वापस लिया जाता है. आम तौर पर, पहली बार मेमोरी को वापस पाने के लिए,
lz4जैसे फ़ास्ट कंप्रेशन एल्गोरिदम का इस्तेमाल किया जाता है. साथ ही, कॉन्टेंट को रैम में सेव किया जाता है.दूसरा चरण: निष्क्रिय के तौर पर मार्क करना (उम्र और ट्रैकिंग):
mmdनिष्क्रिय ट्रैकिंग, कर्नल मेमोरी ट्रैकिंग (CONFIG_ZRAM_TRACK_ENTRY_ACTIME) को ऐक्सेस करती है या पेजों के इस्तेमाल न होने की अवधि को ट्रैक करने के लिए, सॉफ़्टवेयर निष्क्रिय मार्कर का इस्तेमाल करती है.तीसरा चरण: पोस्ट-प्रोसेसिंग 1 - फिर से कंप्रेस करना (मेमोरी में जगह खाली करना): जिन पेजों को फिर से कंप्रेस करने में समय लगता है (
min_idle_secondsसेmax_idle_seconds), उन्हें फिर से कंप्रेस किया जाता है.mmd,/sys/block/zram0/recompressको लिखता है, ताकि कर्नल कोlz4पेज को डीकंप्रेस करने औरzstdका इस्तेमाल करके उसे फिर से कंप्रेस करने का निर्देश दिया जा सके. इससे फ़्लैश राइट वियर के बिना, फ़िज़िकल रैम वापस मिल जाती है.चौथा चरण: प्रोसेस के बाद की दूसरी कार्रवाई - राइटबैक (फ़्लैश स्टोरेज में डेटा ट्रांसफ़र): अगर मेमोरी पर दबाव बना रहता है और पेज, राइटबैक के लिए तय की गई अवधि (आम तौर पर 20 घंटे या उससे ज़्यादा) तक इस्तेमाल नहीं किए जाते हैं, तो
mmdराइटबैक की प्रोसेस शुरू करता है.mmd,/sys/block/zram0/idleमें लिखता है और/sys/block/zram0/writeback, कंप्रेस किए गए पेज को रैम से बैकअप फ़्लैश स्टोरेज में पूरी तरह से हटा देता है.
ZRAM सेटअप कॉन्फ़िगरेशन
mmd ZRAM सेटअप की इन प्रॉपर्टी को लोड और प्रोसेस करता है:
| प्रॉपर्टी | इस्तेमाल करें | डिफ़ॉल्ट |
|---|---|---|
mmd.zram.enabled |
mmd ZRAM सेटअप चालू है या नहीं. |
false |
mmd.zram.num_devices |
कॉन्फ़िगर किए जाने वाले ZRAM डिवाइसों की संख्या. N नंबर के लिए, सिस्टम के sys.boot_completed=1 सेट करने से पहले, zram0 से zram<N-1> डिवाइस मौजूद होने चाहिए.
हर ZRAM डिवाइस की सूची में मौजूद प्रॉपर्टी को हर डिवाइस के हिसाब से कॉन्फ़िगर किया जा सकता है.
|
1 |
mmd.zram.device_priority |
swapon को कॉल करते समय पास की जाने वाली प्राथमिकता वाली वैल्यू. |
सेट नहीं है |
mmd.zram.comp_algorithm |
ZRAM कंप्रेस करने का एल्गोरिदम. अगर यह विकल्प नहीं दिया जाता है, तो कर्नेल के डिफ़ॉल्ट कंप्रेसर एल्गोरिदम का इस्तेमाल किया जाता है. | सेट नहीं है |
mmd.zram.size |
बाइट में ZRAM डिवाइस का साइज़ या डिवाइस की रैम के साइज़ का प्रतिशत. उदाहरण के लिए,
75%.
|
50% |
mmd.zram.writeback.enabled |
ZRAM राइटबैक की सुविधा चालू करनी है या नहीं. | false |
mmd.zram.writeback.device_size |
राइटबैक डिवाइस का साइज़, बाइट में या डेटा पार्टीशन के प्रतिशत के तौर पर. डेटा पार्टीशन पर उपलब्ध जगह के हिसाब से, डिवाइस के साइज़ को अडजस्ट किया जा सकता है. | 1073741824 (1 GiB) |
mmd.zram.writeback.min_free_space_mib |
डिवाइस को सेट अप करने के बाद, राइटबैक के लिए कम से कम इतनी जगह (MiB में) खाली होनी चाहिए. | 1536 (1.5 GiB) |
mmd.zram.writeback.use_nr_tags_prop |
जब true, mmd.zram.writeback.nr_tags में मौजूद वैल्यू का इस्तेमाल करता है, तब यह लूप डिवाइस की क्यू डेप्थ को कॉन्फ़िगर करता है. यह लूप डिवाइस, ZRAM राइटबैक को सपोर्ट करता है. यह उन स्थितियों के लिए एक समाधान है जहां वेंडर SELinux नीति को कॉन्फ़िगर नहीं किया जा सकता, ताकि mmd को ब्लॉक डिवाइस /data के nr_tags को सीधे तौर पर पढ़ने की अनुमति दी जा सके.
|
false |
mmd.zram.writeback.nr_tags |
mmd.zram.writeback.use_nr_tags_prop देखें. |
सेट नहीं है |
mmd.zram.recompression.enabled |
ZRAM रीकंप्रेशन की सुविधा चालू करनी है या नहीं. | false |
mmd.zram.recompression.algorithm |
सेकंडरी ZRAM रीकंप्रेशन एल्गोरिदम. | zstd |
हर ZRAM के हिसाब से डिवाइस की प्रॉपर्टी
जब mmd.zram.num_devices की वैल्यू एक से ज़्यादा होती है, तब कुछ प्रॉपर्टी को हर ZRAM डिवाइस के हिसाब से कॉन्फ़िगर किया जा सकता है. इसके लिए, प्रॉपर्टी को कॉमा लगाकर अलग की गई ऐसी वैल्यू पर सेट करें जिसमें ठीक mmd.zram.num_devices एलिमेंट हों.
इन प्रॉपर्टी में ये शामिल हैं:
mmd.zram.sizemmd.zram.comp_algorithmmmd.zram.device_prioritymmd.zram.recompression.enabledmmd.zram.recompression.huge_idle.enabledmmd.zram.recompression.idle.enabledmmd.zram.recompression.huge.enabledmmd.zram.recompression.threshold_bytesmmd.zram.recompression.algorithmmmd.zram.writeback.device_sizemmd.zram.writeback.huge_idle.enabledmmd.zram.writeback.idle.enabledmmd.zram.writeback.huge.enabled
मौजूदा ZRAM सेटअप बंद किया जा रहा है
Android में अब भी swapon_all उपलब्ध है. इसका इस्तेमाल ZRAM और डिस्क-आधारित स्वैप स्पेस सेट अप करने के लिए किया जा सकता है. हालांकि, ZRAM को मैनेज करने के लिए mmd का इस्तेमाल करना बेहतर है. इससे कॉन्फ़िगरेशन आसानी से किया जा सकता है. साथ ही, ZRAM को फिर से कंप्रेस करने जैसी बेहतर सुविधाएं भी मिलती हैं.
mmd.zram.enabled की ओर से mmd ZRAM सेटअप चालू होने पर:
swapon_allको लागू करने पर, ZRAM सेटअप काम नहीं करता.- मौजूदा ZRAM कॉन्फ़िगरेशन, जैसे कि ओवरले
config_zramWritebackफ़ाइल मेंconfig.xmlऔरro.zram.*राइटबैक सिस्टम प्रॉपर्टी को अनदेखा कर दिया जाता है.
ZRAM के रखरखाव से जुड़े ट्यून किए जा सकने वाले पैरामीटर
ZRAM रखरखाव की सुविधा, बॉक्स से बाहर काम करनी चाहिए. साथ ही, इस सेक्शन में मौजूद सिस्टम प्रॉपर्टी का इस्तेमाल करके, इसे और बेहतर बनाया जा सकता है.
ZRAM के रखरखाव को शेड्यूल करना
ये प्रॉपर्टी कंट्रोल करती हैं कि system_server, ZRAM के रखरखाव वाले टास्क को कब और कैसे शेड्यूल करे.
| प्रॉपर्टी | इस्तेमाल करें | डिफ़ॉल्ट |
|---|---|---|
mm.zram.maintenance.first_delay_seconds |
पहली बार ZRAM रखरखाव शुरू होने से पहले लगने वाला समय. | 3600 (1 घंटा) |
mm.zram.maintenance.periodic_delay_seconds |
ZRAM के रखरखाव को शेड्यूल करने के बीच का समय. | 3600 (1 घंटा) |
mm.zram.maintenance.require_device_idle |
डिवाइस के इस्तेमाल में न होने पर ही, ZRAM रखरखाव शुरू करना है या नहीं. | true |
mm.zram.maintenance.require_battery_not_low |
ज़ेडआरएएम के रखरखाव को शुरू करने से पहले, बैटरी का लेवल कम नहीं होना चाहिए. | true |
ZRAM राइटबैक नीति
यहां दिए गए पैरामीटर से यह कंट्रोल किया जाता है कि बैकिंग डिवाइस में किस तरह की मेमोरी कब लिखी जाती है:
| प्रॉपर्टी | इस्तेमाल करें | डिफ़ॉल्ट |
|---|---|---|
mmd.zram.writeback.backoff_seconds |
पिछली बार राइटबैक ऑपरेशन के बाद से बैकऑफ़ का समय. | 600 (10 मिनट) |
mmd.zram.writeback.min_idle_seconds |
mmd.zram.writeback.max_idle_seconds के साथ मिलकर, इस कुकी का इस्तेमाल यह हिसाब लगाने के लिए किया जाता है कि किसी पेज को राइटबैक के लिए ज़रूरी शर्तें पूरी करने में कितना समय लगेगा. यह हिसाब, मेमोरी के इस्तेमाल के फ़्रैक्शन के आधार पर लगाया जाता है. तय की गई निष्क्रियता की अवधि को दो पैरामीटर के बीच एक्सपोनेंशियल तरीके से इंटरपोलेट किया जाता है, ताकि मेमोरी पर दबाव न पड़ने पर काम को कम किया जा सके.
|
72000 (20 घंटे) |
mmd.zram.writeback.max_idle_seconds |
मेमोरी के इस्तेमाल के आधार पर, पेज के निष्क्रिय होने की अवधि का हिसाब लगाने के लिए ज़्यादा से ज़्यादा इतने सेकंड का इस्तेमाल किया जाता है. | 90000 (25 घंटे) |
mmd.zram.writeback.huge.enabled |
HUGE पेज पर वापस लिखने की सुविधा चालू करनी है या नहीं. |
false |
mmd.zram.writeback.idle.enabled |
IDLE पेज पर वापस लिखने की सुविधा चालू करनी है या नहीं. |
true |
mmd.zram.writeback.huge_idle.enabled |
HUGE_IDLE पेज पर वापस लिखने की सुविधा चालू करनी है या नहीं. |
true |
mmd.zram.writeback.min_bytes |
निष्क्रिय राइटबैक के एक राउंड में वापस लिखने के लिए कम से कम बाइट. | 5242880 (5 एमआईबी) |
mmd.zram.writeback.max_bytes |
निष्क्रिय राइटबैक के एक राउंड में वापस लिखने के लिए ज़्यादा से ज़्यादा बाइट. | 314572800 (300 MiB) |
mmd.zram.writeback.max_bytes_per_day |
24 घंटे की अवधि में, ज़्यादा से ज़्यादा कितने बाइट वापस लिखे जा सकते हैं. | 25769803776 (24 GiB) |
mmd.zram.writeback.limit.enabled |
रोज़ाना के राइटबैक बजट की सीमा के हिसाब से हिसाब रखने की सुविधा चालू करनी है या नहीं. | true |
ZRAM रीकंप्रेशन की नीति
नीचे दिए गए पैरामीटर से यह कंट्रोल किया जाता है कि मेमोरी को कब और किस तरह से फिर से कंप्रेस किया जाए:
| प्रॉपर्टी | इस्तेमाल करें | डिफ़ॉल्ट |
|---|---|---|
mmd.zram.recompression.backoff_seconds |
पिछली बार फिर से कंप्रेस किए जाने के बाद से बैकऑफ़ का समय. | 1800 (30 मिनट) |
mmd.zram.recompression.min_idle_seconds |
mmd.zram.recompression.max_idle_seconds के साथ मिलकर, यह फ़ंक्शन किसी पेज के लिए निष्क्रियता की अवधि का हिसाब लगाता है. इससे यह तय किया जाता है कि पेज को फिर से कंप्रेस किया जा सकता है या नहीं. यह फ़ैसला, मेमोरी के इस्तेमाल के फ़्रैक्शन के आधार पर लिया जाता है. कैलकुलेट की गई आइडल एज को दो पैरामीटर के बीच इंटरपोलेट किया जाता है, ताकि मेमोरी पर दबाव न पड़ने पर काम को कम किया जा सके.
|
7200 (2 घंटे) |
mmd.zram.recompression.max_idle_seconds |
इस कुकी का इस्तेमाल, पेज के निष्क्रिय रहने की अवधि का हिसाब लगाने के लिए किया जाता है. | 14400 (4 घंटे) |
mmd.zram.recompression.threshold_bytes |
रीकंप्रेशन के लिए, ZRAM पेजों का कम से कम साइज़ (बाइट में). | 1024 (1 केआईबी) |
mmd.zram.recompression.huge.enabled |
HUGE पेज को फिर से कंप्रेस करने की सुविधा चालू करनी है या नहीं. |
true |
mmd.zram.recompression.idle.enabled |
IDLE पेज को फिर से कंप्रेस करने की सुविधा चालू करनी है या नहीं. |
true |
mmd.zram.recompression.huge_idle.enabled |
HUGE_IDLE पेज को फिर से कंप्रेस करने की सुविधा चालू करनी है या नहीं. |
true |
ZRAM में मौजूद ऐसे पेज को ट्रैक करना जिनका इस्तेमाल नहीं किया जा रहा है
mmd ZRAM रखरखाव, ZRAM पेजों को निष्क्रिय के तौर पर मार्क करता है. ऐसा इस आधार पर किया जाता है कि उन्हें आखिरी बार कब ऐक्सेस किया गया था. इस सुविधा के लिए, CONFIG_ZRAM_TRACK_ENTRY_ACTIME या CONFIG_ZRAM_MEMORY_TRACKING कर्नल कॉन्फ़िगरेशन चालू होने चाहिए. CONFIG_ZRAM_TRACK_ENTRY_ACTIME, GKI कर्नेल 6.18 और इसके बाद के वर्शन पर डिफ़ॉल्ट रूप से चालू होता है. पिछले कर्नल में, इसमें मेमोरी ओवरहेड होता है और यह डिफ़ॉल्ट रूप से चालू नहीं होता है.
अगर कर्नल कॉन्फ़िगरेशन चालू नहीं है, तो mmd ZRAM रखरखाव के लिए, सॉफ़्टवेयर के विकल्प के तौर पर उपलब्ध लॉजिक का इस्तेमाल किया जाता है. इससे, इस्तेमाल न किए जा रहे ZRAM पेजों को ट्रैक किया जाता है:
mmdशुरू होने पर, सभी ZRAM पेजों को 'निष्क्रिय' के तौर पर मार्क करें.जब तक बैकऑफ़ पीरियड खत्म नहीं हो जाता, तब तक अगले ZRAM रखरखाव को छोड़ दें.
ZRAM, इस्तेमाल न किए जा रहे पेजों को वापस लिखता है या उन्हें फिर से कंप्रेस करता है. अगर राइटबैक की सीमाओं की वजह से कुछ पेज अब भी कुछ समय से इस्तेमाल में नहीं है, तो
mmdअगले रखरखाव के दौरान पेजों को वापस लिखता रहेगा. हालांकि, नए पेजों को कुछ समय से इस्तेमाल में नहीं है के तौर पर मार्क नहीं किया जाएगा (चौथे चरण को छोड़कर).अगर सभी आइडल पेजों को वापस लिख दिया जाता है, तो सभी ZRAM पेजों को फिर से आइडल के तौर पर मार्क करें और दूसरे चरण पर वापस जाएं. अगर ZRAM writeback बंद है, तो
mmd, ZRAM के सभी पेजों को निष्क्रिय के तौर पर मार्क करता है. ऐसा तब होता है, जब ZRAM को फिर से कंप्रेस किया जाता है. यह प्रोसेस, निष्क्रियता की अवधि के बाद होती है.
समस्या हल करने और पुष्टि करने से जुड़ी गाइड
mmd और ZRAM ऑपरेशनों की पुष्टि करने और उनकी जांच करने के लिए, पुष्टि करने का यह तरीका और समस्या हल करने की यह प्रक्रिया अपनाएं.
ZRAM सेटअप की पुष्टि करना
यह पुष्टि करने के लिए कि बूट के दौरान mmd ने ZRAM को कॉन्फ़िगर किया है:
चालू कंप्रेस करने वाले एल्गोरिदम और डिस्क के साइज़ की जांच करें:
cat /sys/block/zram0/comp_algorithm cat /sys/block/zram0/disksizemmdसिस्टम की प्रॉपर्टी और सेवा की मौजूदा स्थिति की पुष्टि करें:getprop | grep mmd.zram dumpsys -l | grep mmd
ZRAM के रखरखाव और राइटबैक की पुष्टि करना
पुष्टि करें कि ZRAM राइटबैक और फिर से कंप्रेस करने से जुड़े रखरखाव के टास्क काम कर रहे हैं:
बैकअप ब्लॉक डिवाइस का स्टेटस देखें:
cat /sys/block/zram0/bd_stat/sys/block/zram0/mm_statको मॉनिटर करके, फिर से कंप्रेस करने की क्षमता की जांच करें. डेटा के कंप्रेस किए गए साइज़ में बदलाव, रखरखाव के साइकल के बाद दिखने चाहिए.
हर प्रोसेस के लिए राइटबैक की पुष्टि करना
यह पुष्टि करने के लिए कि हर प्रोसेस के हिसाब से राइटबैक की सुविधा काम कर रही है, इनका इस्तेमाल किया जा सकता है:
- राइटबैक लॉग या गड़बड़ी की जानकारी के लिए,
adb logcat -s mmdदेखें.
आम समस्याएं और गड़बड़ी की जानकारी
यहां कुछ सामान्य गड़बड़ियों के बारे में बताया गया है जो उपयोगकर्ता को दिख सकती हैं:
WritebackDailyLimitExceeded: इस गड़बड़ी का मतलब है किmmd.zram.writeback.max_bytes_per_dayका कोटा पूरा हो गया है. ऐसा होने पर,mmd, डेटा वापस लिखने की प्रोसेस को तब तक रोक देता है, जब तक कि 24 घंटे की रोलिंग विंडो आगे नहीं बढ़ जाती.Process prefetch or writeback failed: ioctl फ़ेल होने पर, इस गड़बड़ी को logcat में देखा जा सकता है. इसकी सामान्य वजहें ये हैं:EBADFयाESRCH: टारगेट प्रोसेस,mmdके कर्नल कोpidfdभेजने से पहले ही बंद हो गई.ENOSPC: बैकिंग स्टोरेज का पार्टीशन भर गया है या लूप डिवाइस की कतार खत्म हो गई है.
- ZRAM सेट अप नहीं किया गया: अगर
mmdबूट के दौरान ZRAM को कॉन्फ़िगर नहीं कर पाता है, तो इसकी वजह यह हो सकती है कि लेगसीswapon_allया वेंडर की init स्क्रिप्ट नेmmdके एक्ज़ीक्यूट होने से पहले/dev/block/zram0को लॉक कर दिया हो.