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

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. सिस्टम सर्वर, mmd.asyncPrefetchProcessZramMemory(pfd) का इस्तेमाल करके, Binder के ज़रिए ऐप्लिकेशन के pidfd को भेजता है. mmd, ZRAM_ANDROID_IOC_PROCESS_PREFETCH ioctl को जारी करता है. इससे कर्नल को यह निर्देश मिलता है कि वह स्वैप किए गए पेजों को एसिंक्रोनस तरीके से वापस रैम में प्रीफ़ेच करे. ऐसा तब होता है, जब ऐप्लिकेशन का मुख्य यूज़र इंटरफ़ेस (यूआई) थ्रेड शुरू हो रहा होता है.

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

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

mmd में रखरखाव

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

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

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

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

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

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

ZRAM में पोस्ट-प्रोसेसिंग के टास्क

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. चौथा चरण: पोस्ट-प्रोसेसिंग 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.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 कर्नल कॉन्फ़िगरेशन चालू होने चाहिए. GKI कर्नेल 6.18 और इसके बाद के वर्शन पर, CONFIG_ZRAM_TRACK_ENTRY_ACTIME डिफ़ॉल्ट रूप से चालू होता है. पिछले कर्नल में, इसमें मेमोरी ओवरहेड होता है और यह डिफ़ॉल्ट रूप से चालू नहीं होता है.

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

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

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

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

  4. अगर सभी आइडल पेजों को वापस लिख दिया जाता है, तो सभी ज़ेडरैम पेजों को फिर से आइडल के तौर पर मार्क करें और दूसरे चरण पर वापस जाएं. अगर 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 को लॉक कर दिया हो.