برنامج خفي لإدارة الذاكرة

يتوافق الإصدار 17 من نظام التشغيل Android والإصدارات الأحدث مع برنامج خفي لإدارة الذاكرة (mmd)، وهو برنامج خفي للنظام، ويتولّى معالجة إعدادات البرنامج الخفي، والإعدادات القابلة للتعديل، ومهام الصيانة المستمرة للتبديل أو ZRAM.

خلفية

قبل طرح mmd، كانت إعدادات ZRAM في Android مجزّأة ولا تتيح سوى تخصيص محدود. تعالج mmd هذه المشكلة من خلال توسيط إدارة ZRAM، ما يتيح منطق إعداد أكثر تطورًا ويسهّل إضافة ميزات جديدة وتحسينات على البنية. توفّر mmd أيضًا فصلًا واضحًا بين عملية system_server المستندة إلى Java وعملية التبديل أو إدارة الذاكرة على مستوى النواة.

البنية وإدارة ZRAM

عند اكتمال عملية التشغيل (أي عند sys.boot_completed=1)، يحاول mmd_setup ضبط ZRAM باستخدام المَعلمات المحدّدة. بعد اكتمال عملية إعداد ZRAM، يفعّل النظام خدمة mmd التي تتولى مهام الصيانة المستمرة.

في مشروع mmd، يتم بدء عمليات الصيانة من system_server من خلال إرسال طلبات Binder إلى mmd باستخدام واجهة IMmd. يتولّى mmd مهام الصيانة المتعلقة بتنفيذ عمليات إعادة الكتابة في ZRAM وإعادة الضغط وعمليات إعادة الكتابة لكل عملية استنادًا إلى محرك سياساته الداخلية. يمكن ضبط كلّ من سياسات الجدولة من ActivityManagerService وسياسات الصيانة في ZRAM باستخدام خصائص النظام.

دمج خادم النظام (system_server)

تحدّد عملية system_server المستندة إلى Java وقت استدعاء mmd. وتفصل هذه العملية عمليات المسح الشامل للصيانة عن عمليات تحسين الذاكرة المستهدَفة لكل تطبيق.

الصيانة العادية للمعالجة اللاحقة

تتم إدارة ZRAM على مستوى العالم من خلال ActivityManagerService باستخدام com.android.server.memory.ZramMaintenance.

zram-maintenance

الشكل 1: مسار جدولة الصيانة في ZRAM

  • محرك الجدولة: يسجّل ZramMaintenance مهمة دورية تعمل في الخلفية باستخدام JobScheduler في Android.
  • قيود المهمة: لمنع حدوث تقطُّع في واجهة المستخدم الأمامية أو حدوث تعارض في وحدة المعالجة المركزية، يتم ضبط المهمة بشكل صريح باستخدام setRequiresDeviceIdle(true) وsetRequiresBatteryNotLow(true).
  • تفعيل Binder: عندما يتم تفعيل أداة الجدولة، يستدعي onStartJob() الدالة system_server التي تستدعي بدورها الدالة mmd.doZramMaintenanceAsync(). هذا طلب غير متزامن من اتجاه واحد باستخدام Binder، ولا يحظر system_server انتظار انتهاء عمليات الصيانة. تضيف mmd هذا إلى سلسلة عامل الخلفية لتنفيذ إعادة الضغط والكتابة بالتسلسل.

إعادة الكتابة على مستوى كل عملية

تتم إدارة الإخلاء المستهدَف للذاكرة لكل عملية من خلال ActivityManagerService باستخدام com.android.server.am.CachedAppOptimizer.

mmd-writeback

الشكل 2. مخطط إعادة الكتابة لكل عملية في mmd.

عندما تنتقل عملية إلى حالة مخزّنة مؤقتًا في الخلفية، ينفّذ ActivityManager عملية ضغط للذاكرة. إذا كان سيظهر للمستخدم عُطل بسبب نقص الذاكرة في العملية، أي إذا كانت العملية تستضيف نشاطًا، وإذا كانت عملية إعادة الكتابة لكل عملية في ZRAM ستؤدي إلى تقليل استهلاك الذاكرة التي تستخدمها العملية إلى ما يقارب الصفر، سيتّبع النظام الخطوات التالية:

  1. بعد الضغط، يرسل CachedAppOptimizer رسالة مؤجّلة (ZRAM_WRITEBACK_MSG) إلى معالج الضغط الداخلي (يتم التأخير بمقدار mZramWritebackWaitSeconds).
  2. عند انتهاء فترة التأخير، يفتح ActivityManager واصف ملف عملية آمنة pidfd.
  3. يستدعي خادم النظام mmd.asyncWritebackProcessZramMemory(pfd, callback).
  4. ينفّذ mmd عملية 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، ويطلب من النواة جلب الصفحات التي تم تبديلها بشكل غير متزامن إلى ذاكرة الوصول العشوائي (RAM) أثناء تهيئة سلسلة التعليمات الرئيسية لواجهة المستخدم في التطبيق.

نظرة عامة على مهام الصيانة والمعالجة اللاحقة

يوضّح هذا القسم عمليات الصيانة التي تتم في الخلفية ومهام ما بعد المعالجة التي ينفّذها mmd لتحسين مساحة التبديل وذاكرة النظام.

الصيانة في mmd

في mmd، تشير الصيانة إلى عمليات المسح المجدوَلة التي تتم في الخلفية بهدف الصيانة وتحسين استخدام مساحة التبديل والذاكرة الفعلية بدون التأثير في أداء المستخدم النشط في المقدّمة. بدلاً من إجراء عمليات مسح متواصلة ومتزامنة (ما يؤدي إلى حدوث عمليات تنشيط مكثّفة لوحدة المعالجة المركزية وإيقاف مؤقت لعرض واجهة المستخدم)، يتم تنفيذ عمليات الصيانة بشكل غير متزامن:

  1. يتم تشغيل system_server بشكل دوري على مستوى Binder.doZramMaintenanceAsync()

  2. يضع mmd الطلب في قائمة انتظار مهام في الخلفية LowPrioWorkItem::ZramMaintenance.

  3. يتوفّر سلسلة محادثات عاملة واحدة في mmd تدير كلاً من قائمة الانتظار ذات الأولوية العالية وقائمة الانتظار ذات الأولوية المنخفضة. تتم معالجة عناصر العمل ذات الأولوية العالية (مثل الجلب المسبق لكل عملية) أولاً، ويمكن أن تحل محل عناصر العمل ذات الأولوية المنخفضة. تعمل عمليات الصيانة وإعادة الكتابة لكل عملية كعناصر عمل منخفضة الأولوية. عند إزالة العنصر، تنفّذ سلسلة المحادثات الخاصة بالعامل عمليتَي صيانة أساسيتَين بالتسلسل:

    • إعادة ضغط ZRAM: يتم البحث في صفحات المبادلة الحالية وإعادة ضغط الصفحات غير النشطة باستخدام خوارزمية ضغط ثانوية ذات نسبة أعلى، مثل zstd.

    • إعادة كتابة ZRAM: يتم فحص الصفحات غير النشطة وإزالتها بالكامل من ذاكرة الوصول العشوائي (RAM) إلى وحدة تخزين فلاش احتياطية على جهاز حلقي من ملف على /data.

مهام المعالجة اللاحقة في ZRAM

في وحدة ZRAM الخاصة بنواة Linux وبنية mmd، تكون مهام ما بعد المعالجة هي عمليات التحويل غير المتزامنة التي يتم تطبيقها على صفحات الذاكرة بعد أن يتم استبدالها من خلال مسارات الاسترداد العادية للنواة (kswapd أو الضغط).

عند استبدال صفحة في البداية، يعطي النظام الأولوية للسرعة، لذا يستخدم خوارزمية ضغط أساسية سريعة (مثل lz4) ويخزّن الصفحة المضغوطة في ذاكرة الوصول العشوائي. ومع ذلك، بمرور الوقت، تصبح العديد من الصفحات المبدّلة غير نشطة أو في وضع الخمول، مثل التطبيقات المخزّنة مؤقتًا في الخلفية والتي لا يتم استئنافها لعدة ساعات. يؤدي ترك الصفحات غير النشطة في ZRAM سريع ومضغوط بشكل خفيف إلى عدم الكفاءة.

مسار المعالجة اللاحقة

تنفّذ mmd دورة حياة معالجة لاحقة متعدّدة المستويات لتحسين هذه الصفحات:

mmd-page-lifecycle

الشكل 3: mmd مراحل نشاط الصفحة.

  1. المرحلة 1: الاستبدال الأوّلي (الضغط السريع): يتم استرداد الذاكرة أولاً من خلال عملية kswapd أو ضغط التطبيق. يتم عادةً تنفيذ عملية الاسترداد الأولى باستخدام خوارزمية ضغط سريعة، مثل lz4، ويتم تخزين المحتوى في ذاكرة الوصول العشوائي (RAM).

  2. المرحلة 2: وضع علامة على الصفحات غير النشطة (التعتيق والتتبُّع): يصل تتبُّع الصفحات غير النشطة mmd إلى تتبُّع ذاكرة النواة (CONFIG_ZRAM_TRACK_ENTRY_ACTIME) أو يستخدم علامة البرامج غير النشطة لتتبُّع المدة التي لم يتم فيها استخدام الصفحات.

  3. المرحلة 3: ما بعد المعالجة 1 - إعادة الضغط (استرداد الذاكرة): تتم إعادة ضغط الصفحات التي تصل إلى مدة عدم النشاط لإعادة الضغط (من min_idle_seconds إلى max_idle_seconds). تكتب mmd إلى /sys/block/zram0/recompress لتوجيه النواة إلى فك ضغط الصفحة lz4 وإعادة ضغطها باستخدام zstd. يؤدي ذلك إلى استعادة ذاكرة الوصول العشوائي (RAM) الفعلية بدون التسبب في تآكل ذاكرة الفلاش.

  4. المرحلة 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، يجب أن تتوفّر الأجهزة من zram0 إلى zram<N-1> قبل أن يضبط النظام القيمة sys.boot_completed=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 غيبيبايت)
mmd.zram.writeback.min_free_space_mib الحد الأدنى للمساحة الخالية بوحدة MiB التي يجب أن تكون متاحة بعد إعداد جهاز الكتابة الاحتياطية. 1536 (1.5 غيبيبايت)
mmd.zram.writeback.use_nr_tags_prop عندما تكون قيمة true هي 1، يتم استخدام القيمة في mmd.zram.writeback.nr_tags لضبط عمق قائمة الانتظار لعملية الكتابة الاحتياطية في ZRAM لجهاز الحلقة. هذا حلّ بديل للحالات التي لا يمكن فيها ضبط سياسة SELinux الخاصة بالمورّد للسماح mmd بقراءة nr_tags مباشرةً من جهاز الحظر /data. 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 الحالية

في حين أنّ swapon_all لا يزال متاحًا في Android لإعداد ZRAM ومساحة التبديل المستندة إلى القرص، فإنّ mmd هو الأسلوب المفضّل لإدارة ZRAM من أجل تسهيل عملية الإعداد والميزات المتقدّمة، مثل إعادة ضغط ZRAM.

عندما يفعّل mmd.zram.enabled إعداد mmd ZRAM:

  • يصبح إعداد ZRAM في عملية تنفيذ swapon_all عملية غير قابلة للتنفيذ.
  • يتم تجاهل إعدادات ZRAM الحالية، مثل config_zramWriteback في ملف التراكب config.xml وخصائص نظام ro.zram.* writeback.

خيارات قابلة للضبط لصيانة ZRAM

من المفترض أن تعمل صيانة ZRAM بدون أي إعدادات إضافية، ويمكنك تحسينها بشكل أكبر باستخدام خصائص النظام في هذا القسم.

جدولة صيانة ZRAM

تتحكّم هذه الخصائص في كيفية وجدولة مهام الصيانة في ZRAM من خلال system_server.

الخاصية استخدام تلقائي
mm.zram.maintenance.first_delay_seconds تمثّل هذه السمة الوقت الفاصل قبل بدء عملية الصيانة الأولى في ZRAM. 3600 (ساعة واحدة)
mm.zram.maintenance.periodic_delay_seconds التأخير بين جدولة الصيانة اللاحقة لـ ZRAM 3600 (ساعة واحدة)
mm.zram.maintenance.require_device_idle تحديد ما إذا كان يجب بدء صيانة ZRAM فقط عندما يكون الجهاز غير نشط true
mm.zram.maintenance.require_battery_not_low تحديد ما إذا كان يجب أن يكون مستوى شحن البطارية غير منخفض قبل بدء صيانة ZRAM 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 ميبيبايت)
mmd.zram.writeback.max_bytes_per_day الحد الأقصى لعدد البايتات التي يمكن إعادة كتابتها خلال 24 ساعة 25769803776 (24 غيبيبايت)
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 (ساعتان)
mmd.zram.recompression.max_idle_seconds الحد الأقصى لعدد الثواني المستخدَمة لاحتساب عمر الصفحة غير النشطة بشكل ديناميكي 14400 (4 ساعات)
mmd.zram.recompression.threshold_bytes الحد الأدنى لحجم صفحات ZRAM بالبايت التي يتم أخذها في الاعتبار لإعادة الضغط 1024 (1 KiB)
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. وضع علامة "غير نشطة" على جميع صفحات ZRAM عند بدء mmd

  2. تخطّي عمليات الصيانة التالية في ZRAM إلى أن تنتهي فترة الانتظار المطلوبة

  3. إعادة كتابة ZRAM أو إعادة ضغط الصفحات غير النشطة إذا بقيت صفحات غير نشطة بسبب حدود إعادة الكتابة، ستواصل mmd إعادة كتابة الصفحات في عملية الصيانة التالية بدون وضع علامة على الصفحات الجديدة كغير نشطة (تخطّي الخطوة 4).

  4. إذا تمت إعادة كتابة جميع الصفحات غير النشطة، ضَع علامة غير نشطة على جميع صفحات ZRAM مرة أخرى، ثم انتقِل إلى الخطوة 2. في حال إيقاف ميزة "الكتابة الاحتياطية في ZRAM"، تضع 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: يمكن ملاحظة هذا الخطأ في logcat عند تعذُّر تنفيذ ioctl. تشمل الأسباب الشائعة ما يلي:
    • EBADF أو ESRCH: انتهت العملية المستهدَفة قبل أن يتمكّن mmd من إرسال pidfd إلى النواة.
    • ENOSPC: قسم مساحة التخزين الاحتياطية ممتلئ، أو تم استنفاد قائمة انتظار جهاز التكرار الحلقي.
  • لم يتم إعداد ZRAM: إذا تعذّر على mmd ضبط ZRAM عند بدء التشغيل، قد يرجع ذلك إلى أنّ النصوص البرمجية القديمة swapon_all أو نصوص init البرمجية الخاصة بالمورّد أغلقت /dev/block/zram0 قبل أن يتمكّن mmd من التنفيذ.