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)को शुरू करता है.- सिस्टम सर्वर,
mmd.asyncPrefetchProcessZramMemory(pfd)का इस्तेमाल करके, Binder के ज़रिए ऐप्लिकेशन केpidfdको भेजता है.mmd,ZRAM_ANDROID_IOC_PROCESS_PREFETCHioctl को जारी करता है. इससे कर्नल को यह निर्देश मिलता है कि वह स्वैप किए गए पेजों को एसिंक्रोनस तरीके से वापस रैम में प्रीफ़ेच करे. ऐसा तब होता है, जब ऐप्लिकेशन का मुख्य यूज़र इंटरफ़ेस (यूआई) थ्रेड शुरू हो रहा होता है.
रखरखाव और पोस्ट-प्रोसेसिंग से जुड़े टास्क के बारे में खास जानकारी
इस सेक्शन में, बैकग्राउंड में रखरखाव से जुड़ी कार्रवाइयों और पोस्ट-प्रोसेसिंग टास्क के बारे में बताया गया है. mmd इन कार्रवाइयों और टास्क को स्वैप स्पेस और सिस्टम मेमोरी को ऑप्टिमाइज़ करने के लिए करता है.
mmd में रखरखाव
mmd में, मेंटेनेंस का मतलब है कि बैकग्राउंड में होने वाली ऐसी प्रोसेस जो पहले से तय होती हैं. ये प्रोसेस, स्वैप स्पेस और फ़िज़िकल मेमोरी के इस्तेमाल को ऑप्टिमाइज़ करती हैं. साथ ही, इससे ऐक्टिव उपयोगकर्ता की फ़ोरग्राउंड परफ़ॉर्मेंस पर कोई असर नहीं पड़ता. लगातार और एक साथ होने वाले स्वीप (जिससे सीपीयू के इस्तेमाल में काफ़ी बढ़ोतरी होती है और यूज़र इंटरफ़ेस (यूआई) में रुकावट आती है) के बजाय, रखरखाव एसिंक्रोनस तरीके से किया जाता है:
system_server, Binder में समय-समय परdoZramMaintenanceAsync()को ट्रिगर करता है.mmdअनुरोध को बैकग्राउंड वर्क क्यूLowPrioWorkItem::ZramMaintenanceमें रखता है.mmdमें एक ही वर्कर थ्रेड होती है. यह थ्रेड, ज़्यादा प्राथमिकता वाली और कम प्राथमिकता वाली, दोनों तरह की कतारों को मैनेज करती है. ज़्यादा प्राथमिकता वाले वर्क आइटम (जैसे, हर प्रोसेस के लिए प्रीफ़ेच) को पहले प्रोसेस किया जाता है. साथ ही, ये कम प्राथमिकता वाले वर्क आइटम को रोक सकते हैं. रखरखाव और हर प्रोसेस के लिए राइटबैक, कम प्राथमिकता वाले वर्क आइटम के तौर पर काम करते हैं. पॉप होने पर, वर्कर थ्रेड रखरखाव से जुड़ी दो मुख्य कार्रवाइयां क्रम से करता है:ZRAM रीकंप्रेशन: यह सुविधा, मौजूदा स्वैप पेजों को स्कैन करती है. साथ ही, ज़्यादा अनुपात वाले सेकंडरी कंप्रेशन एल्गोरिदम का इस्तेमाल करके, कुछ समय से इस्तेमाल में नहीं है पेजों को फिर से कंप्रेस करती है. उदाहरण के लिए,
zstd.ज़ेडआरएएम राइटबैक: यह सुविधा, इस्तेमाल न किए जा रहे पेजों को स्कैन करती है और उन्हें रैम से पूरी तरह हटा देती है. इसके बाद, उन्हें
/dataपर मौजूद किसी फ़ाइल से लूप डिवाइस के तौर पर बैकअप फ़्लैश स्टोरेज में सेव कर देती है.
ZRAM में पोस्ट-प्रोसेसिंग के टास्क
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का इस्तेमाल करके उसे फिर से कंप्रेस करने का निर्देश दिया जा सके. इससे फ़्लैश राइट वियर के बिना, फ़िज़िकल रैम वापस मिल जाती है.चौथा चरण: पोस्ट-प्रोसेसिंग 2 - राइटबैक (फ़्लैश स्टोरेज में डेटा ट्रांसफ़र): अगर मेमोरी पर दबाव बना रहता है और पेज, राइटबैक के लिए तय की गई समयसीमा (आम तौर पर 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 कर्नल कॉन्फ़िगरेशन चालू होने चाहिए. GKI कर्नेल 6.18 और इसके बाद के वर्शन पर, CONFIG_ZRAM_TRACK_ENTRY_ACTIME डिफ़ॉल्ट रूप से चालू होता है. पिछले कर्नल में, इसमें मेमोरी ओवरहेड होता है और यह डिफ़ॉल्ट रूप से चालू नहीं होता है.
अगर कर्नल कॉन्फ़िगरेशन चालू नहीं है, तो mmd ZRAM रखरखाव के लिए, सॉफ़्टवेयर के विकल्प के तौर पर उपलब्ध लॉजिक का इस्तेमाल किया जाता है. इससे, इस्तेमाल न किए जा रहे ZRAM पेजों को ट्रैक किया जाता है:
mmdशुरू होने पर, सभी ZRAM पेजों को 'निष्क्रिय' के तौर पर मार्क करें.जब तक बैकऑफ़ पीरियड खत्म नहीं हो जाता, तब तक अगले ZRAM रखरखाव को छोड़ दें.
ZRAM, इस्तेमाल न किए जा रहे पेजों को वापस लिखता है या उन्हें फिर से कंप्रेस करता है. अगर राइटबैक की सीमाओं की वजह से कुछ पेज अब भी इस्तेमाल नहीं किए जा रहे हैं, तो
mmdअगले रखरखाव के दौरान पेजों को राइट बैक करना जारी रखता है. हालांकि, नए पेजों को इस्तेमाल नहीं किया जा रहा है के तौर पर मार्क नहीं किया जाता (चौथे चरण को छोड़कर).अगर सभी आइडल पेजों को वापस लिख दिया जाता है, तो सभी ज़ेडरैम पेजों को फिर से आइडल के तौर पर मार्क करें और दूसरे चरण पर वापस जाएं. अगर 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को लॉक कर दिया हो.