मेमोरी मैनेजमेंट डीमन

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-maintenance

पहली इमेज. ZRAM के रखरखाव को शेड्यूल करने का फ़्लो.

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

हर प्रोसेस के लिए राइटबैक

हर प्रोसेस के हिसाब से मेमोरी खाली करने की सुविधा को ActivityManagerService मैनेज करता है. इसके लिए, वह com.android.server.am.CachedAppOptimizer का इस्तेमाल करता है.

mmd-writeback

दूसरी इमेज. हर प्रोसेस के लिए, mmd पर-प्रोसेस राइटबैक फ़्लो.

जब कोई प्रोसेस, बैकग्राउंड में कैश की गई स्थिति में ट्रांज़िशन करती है, तो ActivityManager मेमोरी को कंपैक्ट करता है. अगर प्रोसेस को कम मेमोरी की वजह से बंद करने की सूचना उपयोगकर्ता को दिखेगी, तो इसका मतलब है कि प्रोसेस, गतिविधि को होस्ट करती है. अगर हर प्रोसेस के लिए ZRAM राइटबैक, प्रोसेस के मेमोरी फ़ुटप्रिंट को शून्य के करीब ले जाएगा, तो सिस्टम यह तरीका अपनाता है:

  1. कंपैक्शन के बाद, CachedAppOptimizer अपने इंटरनल कंपैक्शन हैंडलर को कुछ समय बाद एक मैसेज (ZRAM_WRITEBACK_MSG) भेजता है. इसमें mZramWritebackWaitSeconds की देरी होती है.
  2. समयसीमा खत्म होने पर, ActivityManager एक सुरक्षित प्रोसेस फ़ाइल डिसक्रिप्टर pidfd खोलता है.
  3. सिस्टम सर्वर, mmd.asyncWritebackProcessZramMemory(pfd, callback) को कॉल करता है.
  4. mmd, हर प्रोसेस के लिए writeback ioctl को एक्ज़ीक्यूट करता है और IMmdProcessWritebackCallback का इस्तेमाल करके वापस रिपोर्ट करता है. अगर प्रोसेस पूरी हो जाती है, तो ActivityManager, प्रोसेस रिकॉर्ड (setIsZramWrittenBack(app, true)) को फ़्लैग करता है, ताकि प्रोसेस की oom_score_adj को बढ़ाया जा सके. साथ ही, FrameworkStatsLog.ZRAM_WRITEBACK_EVENT में मेट्रिक लॉग करता है.

हर प्रोसेस के हिसाब से प्रीफ़ेच करने की सुविधा

जब कोई उपयोगकर्ता, पहले से कैश किए गए किसी ऐप्लिकेशन को फिर से लॉन्च करता है (UNFREEZE_REASON_ACTIVITY की वजह से अनफ़्रीज़ किया गया), तो ActivityManager, बैकअप स्टोरेज से होने वाली मुख्य पेज की गड़बड़ियों की वजह से ऐप्लिकेशन के स्टार्टअप में होने वाली देरी को कम करता है:

  1. CachedAppOptimizer, अनफ़्रीज़ इवेंट को इंटरसेप्ट करता है और prefetchZram(app) को शुरू करता है.
  2. सिस्टम सर्वर, ऐप्लिकेशन के pidfd को Binder के ज़रिए mmd.asyncPrefetchProcessZramMemory(pfd) का इस्तेमाल करके भेजता है. mmd, ZRAM_ANDROID_IOC_PROCESS_PREFETCH ioctl जारी करता है. इससे कर्नल को यह निर्देश मिलता है कि ऐप्लिकेशन के मुख्य यूज़र इंटरफ़ेस (यूआई) थ्रेड के शुरू होने के दौरान, स्वैप किए गए पेजों को एसिंक्रोनस तरीके से वापस रैम में प्रीफ़ेच किया जाए.

रखरखाव और पोस्ट-प्रोसेसिंग के टास्क के बारे में खास जानकारी

इस सेक्शन में, बैकग्राउंड में रखरखाव से जुड़ी कार्रवाइयों और पोस्ट-प्रोसेसिंग टास्क के बारे में बताया गया है. mmd इन कार्रवाइयों और टास्क को स्वैप स्पेस और सिस्टम मेमोरी को ऑप्टिमाइज़ करने के लिए करता है.

mmd में रखरखाव

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

  1. system_server, Binder में समय-समय पर doZramMaintenanceAsync() को ट्रिगर करता है.

  2. mmd अनुरोध को बैकग्राउंड वर्क क्यू LowPrioWorkItem::ZramMaintenance में रखता है.

  3. mmd में एक ही वर्कर थ्रेड होता है, जो ज़्यादा प्राथमिकता वाली और कम प्राथमिकता वाली, दोनों कतारों को मैनेज करता है. ज़्यादा प्राथमिकता वाले वर्क आइटम (जैसे, हर प्रोसेस के लिए प्रीफ़ेच) को पहले प्रोसेस किया जाता है. साथ ही, ये कम प्राथमिकता वाले वर्क आइटम को रोक सकते हैं. रखरखाव और हर प्रोसेस के लिए राइटबैक, कम प्राथमिकता वाले वर्क आइटम के तौर पर काम करते हैं. पॉप होने पर, वर्कर थ्रेड क्रम से रखरखाव से जुड़ी दो मुख्य कार्रवाइयां करता है:

    • ZRAM रीकंप्रेशन: यह मौजूदा स्वैप पेजों को स्कैन करता है. साथ ही, ज़्यादा अनुपात वाले सेकंडरी कंप्रेशन एल्गोरिदम का इस्तेमाल करके, कुछ समय से इस्तेमाल में नहीं है पेजों को फिर से कंप्रेस करता है. उदाहरण के लिए, zstd.

    • ज़ेडआरएएम राइटबैक: यह सुविधा, इस्तेमाल न किए जा रहे पेजों को स्कैन करती है और उन्हें रैम से पूरी तरह हटा देती है. इसके बाद, उन्हें /data पर मौजूद किसी फ़ाइल से लूप डिवाइस के तौर पर बैकअप फ़्लैश स्टोरेज में सेव कर देती है.

ज़ेडआरएएम में पोस्ट-प्रोसेसिंग के टास्क

Linux कर्नल के ZRAM मॉड्यूल और mmd आर्किटेक्चर में, पोस्ट-प्रोसेसिंग के टास्क ऐसे एसिंक्रोनस ट्रांसफ़ॉर्मेशन होते हैं जो मेमोरी पेजों पर तब लागू होते हैं, जब उन्हें कर्नल के स्टैंडर्ड रीक्लेम पाथ (kswapd या कंपैक्शन) से पहले ही स्वैप आउट कर दिया गया हो.

जब किसी पेज को पहली बार स्वैप किया जाता है, तो सिस्टम स्पीड को प्राथमिकता देता है: यह तेज़ प्राइमरी कंप्रेशन एल्गोरिदम (जैसे कि lz4) का इस्तेमाल करता है और कंप्रेस किए गए पेज को रैम में सेव करता है. हालांकि, समय के साथ, स्वैप किए गए कई पेज ठंडे या कुछ समय से इस्तेमाल में नहीं हैं. उदाहरण के लिए, बैकग्राउंड में कैश मेमोरी में सेव किए गए ऐसे ऐप्लिकेशन जिन्हें कई घंटों तक फिर से शुरू नहीं किया जाता. ठंडे पेजों को तेज़ी से और कम कंप्रेस किए गए ZRAM में छोड़ने से, सिस्टम की परफ़ॉर्मेंस पर बुरा असर पड़ता है.

पोस्ट-प्रोसेसिंग पाइपलाइन

mmd इन पेजों को ऑप्टिमाइज़ करने के लिए, पोस्ट-प्रोसेसिंग के अलग-अलग लेवल वाला लाइफ़साइकल लागू करता है:

mmd-page-lifecycle

तीसरी इमेज. mmd पेज लाइफ़साइकल.

  1. पहला चरण: शुरुआती स्वैप-आउट (तेज़ कंप्रेस): मेमोरी को सबसे पहले kswapd या ऐप्लिकेशन कंपैक्शन के ज़रिए वापस लिया जाता है. आम तौर पर, पहली बार मेमोरी को वापस पाने के लिए, lz4 जैसे फ़ास्ट कंप्रेशन एल्गोरिदम का इस्तेमाल किया जाता है. साथ ही, कॉन्टेंट को रैम में सेव किया जाता है.

  2. दूसरा चरण: निष्क्रिय के तौर पर मार्क करना (उम्र और ट्रैकिंग): mmd निष्क्रिय ट्रैकिंग, कर्नल मेमोरी ट्रैकिंग (CONFIG_ZRAM_TRACK_ENTRY_ACTIME) को ऐक्सेस करती है या पेजों के इस्तेमाल न होने की अवधि को ट्रैक करने के लिए, सॉफ़्टवेयर निष्क्रिय मार्कर का इस्तेमाल करती है.

  3. तीसरा चरण: पोस्ट-प्रोसेसिंग 1 - फिर से कंप्रेस करना (मेमोरी में जगह खाली करना): जिन पेजों को फिर से कंप्रेस करने में समय लगता है (min_idle_seconds से max_idle_seconds), उन्हें फिर से कंप्रेस किया जाता है. mmd, /sys/block/zram0/recompress को लिखता है, ताकि कर्नल को lz4 पेज को डीकंप्रेस करने और zstd का इस्तेमाल करके उसे फिर से कंप्रेस करने का निर्देश दिया जा सके. इससे फ़्लैश राइट वियर के बिना, फ़िज़िकल रैम वापस मिल जाती है.

  4. चौथा चरण: प्रोसेस के बाद की दूसरी कार्रवाई - राइटबैक (फ़्लैश स्टोरेज में डेटा ट्रांसफ़र): अगर मेमोरी पर दबाव बना रहता है और पेज, राइटबैक के लिए तय की गई अवधि (आम तौर पर 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.size
  • mmd.zram.comp_algorithm
  • mmd.zram.device_priority
  • mmd.zram.recompression.enabled
  • mmd.zram.recompression.huge_idle.enabled
  • mmd.zram.recompression.idle.enabled
  • mmd.zram.recompression.huge.enabled
  • mmd.zram.recompression.threshold_bytes
  • mmd.zram.recompression.algorithm
  • mmd.zram.writeback.device_size
  • mmd.zram.writeback.huge_idle.enabled
  • mmd.zram.writeback.idle.enabled
  • mmd.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 पेजों को ट्रैक किया जाता है:

  1. mmd शुरू होने पर, सभी ZRAM पेजों को 'निष्क्रिय' के तौर पर मार्क करें.

  2. जब तक बैकऑफ़ पीरियड खत्म नहीं हो जाता, तब तक अगले ZRAM रखरखाव को छोड़ दें.

  3. ZRAM, इस्तेमाल न किए जा रहे पेजों को वापस लिखता है या उन्हें फिर से कंप्रेस करता है. अगर राइटबैक की सीमाओं की वजह से कुछ पेज अब भी कुछ समय से इस्तेमाल में नहीं है, तो mmd अगले रखरखाव के दौरान पेजों को वापस लिखता रहेगा. हालांकि, नए पेजों को कुछ समय से इस्तेमाल में नहीं है के तौर पर मार्क नहीं किया जाएगा (चौथे चरण को छोड़कर).

  4. अगर सभी आइडल पेजों को वापस लिख दिया जाता है, तो सभी ZRAM पेजों को फिर से आइडल के तौर पर मार्क करें और दूसरे चरण पर वापस जाएं. अगर ZRAM writeback बंद है, तो mmd, ZRAM के सभी पेजों को निष्क्रिय के तौर पर मार्क करता है. ऐसा तब होता है, जब ZRAM को फिर से कंप्रेस किया जाता है. यह प्रोसेस, निष्क्रियता की अवधि के बाद होती है.

समस्या हल करने और पुष्टि करने से जुड़ी गाइड

mmd और ZRAM ऑपरेशनों की पुष्टि करने और उनकी जांच करने के लिए, पुष्टि करने का यह तरीका और समस्या हल करने की यह प्रक्रिया अपनाएं.

ZRAM सेटअप की पुष्टि करना

यह पुष्टि करने के लिए कि बूट के दौरान mmd ने ZRAM को कॉन्फ़िगर किया है:

  1. चालू कंप्रेस करने वाले एल्गोरिदम और डिस्क के साइज़ की जांच करें:

    cat /sys/block/zram0/comp_algorithm
    cat /sys/block/zram0/disksize
    
  2. mmd सिस्टम की प्रॉपर्टी और सेवा की मौजूदा स्थिति की पुष्टि करें:

    getprop | grep mmd.zram
    dumpsys -l | grep mmd
    

ZRAM के रखरखाव और राइटबैक की पुष्टि करना

पुष्टि करें कि ZRAM राइटबैक और फिर से कंप्रेस करने से जुड़े रखरखाव के टास्क काम कर रहे हैं:

  1. बैकअप ब्लॉक डिवाइस का स्टेटस देखें:

    cat /sys/block/zram0/bd_stat
    
  2. /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 को लॉक कर दिया हो.