برنامج الخفي لقتل العمليات التي تستهلك ذاكرة منخفضة

تراقب عملية البرنامج الخفي lmkd في نظام Android حالة الذاكرة في نظام Android قيد التشغيل، وتستجيب للضغط العالي على الذاكرة عن طريق إيقاف العمليات الأقل أهمية للحفاظ على أداء النظام بمستويات مقبولة.

لمحة عن ضغط الذاكرة

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

في السابق، كان نظام التشغيل Android يراقب ضغط ذاكرة النظام باستخدام برنامج تشغيل LMK (إغلاق التطبيقات بسبب نقص الذاكرة) داخل النواة، وهي آلية صارمة تعتمد على قيم مبرمَجة. اعتبارًا من الإصدار 4.12 من النواة، تمت إزالة برنامج تشغيل LMK من النواة الرئيسية، وتنفّذ مساحة المستخدم lmkd مهام مراقبة الذاكرة وإيقاف العمليات.

معلومات عن توقّف الضغط

يتوافق الإصدار 10 من نظام التشغيل Android والإصدارات الأحدث مع وضع lmkd جديد يستخدم أدوات مراقبة معلومات PSI الخاصة بضغط النواة لرصد ضغط الذاكرة. تقيس مجموعة تصحيحات PSI في نواة المصدر (التي تم نقلها إلى الإصدارين 4.9 و4.14 من النواة) مقدار الوقت الذي تتأخر فيه المهام نتيجة لنقص الذاكرة. وبما أنّ حالات التأخير هذه تؤثر بشكل مباشر في تجربة المستخدم، فهي تمثّل مقياسًا مناسبًا لتحديد مستوى خطورة ضغط الذاكرة. يتضمّن النواة الأصلية أيضًا أدوات مراقبة PSI التي تتيح لعمليات مساحة المستخدم ذات الامتيازات (مثل lmkd) تحديد حدود قصوى لهذه التأخيرات والاشتراك في الأحداث من النواة عند تجاوز الحدّ الأقصى.

مراقبة مؤشر معايير التلوّث مقارنةً بإشارات vmpressure

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

استخدام شاشات PSI

لاستخدام أدوات مراقبة PSI بدلاً من أحداث vmpressure، اضبط السمة ro.lmk.use_psi. القيمة التلقائية هي true، ما يجعل PSI يراقب الآلية التلقائية لرصد ضغط الذاكرة في lmkd. بما أنّ أدوات مراقبة PSI تتطلّب توفّر دعم في النواة، يجب أن تتضمّن النواة تصحيحات PSI المتوافقة مع الإصدارات القديمة وأن يتم تجميعها مع تفعيل دعم PSI (CONFIG_PSI=y).

عيوب برنامج تشغيل LMK داخل النواة

توقّف نظام التشغيل Android عن استخدام برنامج تشغيل LMK بسبب عدد من المشاكل، بما في ذلك:

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

Userspace lmkd

تنفّذ مساحة المستخدم lmkd الوظيفة نفسها التي ينفّذها برنامج التشغيل داخل النواة، ولكنها تستخدم آليات النواة الحالية لرصد الضغط على الذاكرة وتقديره. وتشمل هذه الآليات استخدام أحداث vmpressure من إنشاء النواة أو أدوات مراقبة معلومات PSI لتلقّي إشعارات بشأن مستويات ضغط الذاكرة، واستخدام ميزات مجموعة التحكّم في الذاكرة (cgroup) للحدّ من موارد الذاكرة المخصّصة لكل عملية استنادًا إلى أهمية العملية.

استخدام lmkd في مساحة المستخدم في Android 10

في الإصدار 9 من نظام التشغيل Android والإصدارات الأحدث، يتم تفعيل lmkd في مساحة المستخدم إذا لم يتم رصد برنامج تشغيل LMK في النواة. بما أنّ مساحة المستخدم lmkd تتطلّب توفّر دعم في النواة لمجموعات التحكّم في الذاكرة، يجب تجميع النواة باستخدام إعدادات الضبط التالية:

CONFIG_ANDROID_LOW_MEMORY_KILLER=n
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y

استراتيجيات الإيقاف

تتيح مساحة المستخدم lmkd استراتيجيات إنهاء تستند إلى أحداث vmpressure أو أدوات مراقبة PSI، ومدى خطورتها، وتلميحات أخرى مثل استخدام مساحة التبديل. تختلف استراتيجيات الإغلاق بين الأجهزة ذات الذاكرة المنخفضة والأجهزة العالية الأداء:

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

يمكنك ضبط استراتيجية الإيقاف باستخدام السمة ro.config.low_ram.

تتيح مساحة المستخدم lmkd أيضًا وضعًا قديمًا تتخذ فيه قرارات الإيقاف باستخدام الاستراتيجيات نفسها التي يستخدمها برنامج تشغيل LMK داخل النواة (أي حدود الذاكرة الحرة وذاكرة التخزين المؤقت للملفات). لتفعيل الوضع القديم، اضبط السمة ro.lmk.use_minfree_levels على true.

ضبط lmkd

اضبط lmkd لجهاز معيّن باستخدام الخصائص التالية.

الخاصية استخدام تلقائي
ro.config.low_ram تحديد ما إذا كان الجهاز ذا ذاكرة وصول عشوائي (RAM) منخفضة أو جهازًا عالي الأداء false
ro.lmk.use_psi استخدِم أدوات مراقبة مؤشر PSI (بدلاً من أحداث vmpressure). true
ro.lmk.use_minfree_levels استخدام حدود الذاكرة الحرة وذاكرة التخزين المؤقت للملفات لاتخاذ قرارات بشأن إيقاف العمليات (أي مطابقة وظائف برنامج تشغيل LMK داخل النواة). false
ro.lmk.low الحد الأدنى لنتيجة oom_adj للعمليات المؤهَّلة ليتم إيقافها عند مستوى vmpressure منخفض 1001
(غير مفعَّل)
ro.lmk.medium الحد الأدنى لنتيجة oom_adj للعمليات المؤهَّلة للإيقاف عند مستوى vmpressure المتوسط 800
(الخدمات المخزّنة مؤقتًا أو غير الأساسية)
ro.lmk.critical الحد الأدنى لنتيجة oom_adj للعمليات المؤهَّلة ليتم إيقافها عند مستوى vmpressure الحرج. 0
(أي عملية)
ro.lmk.critical_upgrade فعِّل الترقية إلى المستوى الحرج. false
ro.lmk.upgrade_pressure الحد الأقصى mem_pressure الذي يتم عنده رفع المستوى لأنّ النظام يبدّل البيانات بشكل مفرط. 100
(غير مفعَّل)
ro.lmk.downgrade_pressure الحد الأدنى mem_pressure الذي يتم تجاهل حدث vmpressure عنده لأنّه لا يزال يتوفّر قدر كافٍ من الذاكرة الحرة. 100
(غير مفعَّل)
ro.lmk.kill_heaviest_task إيقاف المهمة الأثقل المؤهَّلة (أفضل قرار) بدلاً من أي مهمة مؤهَّلة (قرار سريع) false
ro.lmk.kill_timeout_ms المدة بالملي ثانية بعد إيقاف التطبيق عندما لا يتم إيقافه مرة أخرى. 0
(غير مفعَّل)
ro.lmk.debug فعِّل lmkd سجلّات تصحيح الأخطاء. false

مثال على إعدادات الجهاز:

PRODUCT_PROPERTY_OVERRIDES += \
    ro.lmk.low=1001 \
    ro.lmk.medium=800 \
    ro.lmk.critical=0 \
    ro.lmk.critical_upgrade=false \
    ro.lmk.upgrade_pressure=100 \
    ro.lmk.downgrade_pressure=100 \
    ro.lmk.kill_heaviest_task=true

برنامج lmkd في مساحة المستخدم في Android 11

يحسّن الإصدار 11 من نظام التشغيل Android lmkd من خلال تقديم استراتيجية جديدة لإيقاف التطبيقات. تستخدِم استراتيجية الإيقاف آلية PSI لرصد ضغط الذاكرة، وقد تم طرحها في نظام التشغيل Android 10. تراعي lmkd في نظام التشغيل Android 11 مستويات استخدام موارد الذاكرة والتبديل السريع بين العمليات لمنع نقص الذاكرة وتدهور الأداء. تحلّ استراتيجية الإيقاف هذه محل الاستراتيجيات السابقة ويمكن استخدامها على الأجهزة ذات الأداء العالي والأجهزة ذات ذاكرة الوصول العشوائي المنخفضة (Android Go).

متطلبات النواة

بالنسبة إلى أجهزة Android 11، تتطلّب lmkd ميزات النواة التالية:

  • تضمين تصحيحات PSI وتفعيل PSI (تتوفر عمليات نقل إلى إصدارات أقدم في نواة Android الشائعة 4.9 و4.14 و4.19).
  • تضمين تصحيحات تتوافق مع PIDFD (تتوفّر عمليات نقل إلى إصدارات أقدم في نواة Android الشائعة 4.9 و4.14 و4.19).
  • بالنسبة إلى الأجهزة ذات ذاكرة الوصول العشوائي المنخفضة، أدرِج مجموعات التحكّم في الذاكرة.

يجب تجميع النواة باستخدام إعدادات الضبط التالية:

CONFIG_PSI=y

ضبط lmkd في Android 11

تتيح استراتيجية إيقاف العمليات في الذاكرة في نظام التشغيل Android 11 عناصر التحكّم والإعدادات التلقائية المدرَجة أدناه. تعمل هذه الميزات على الأجهزة ذات الأداء العالي والأجهزة ذات ذاكرة الوصول العشوائي المنخفضة.

الخاصية استخدام تلقائي
أداء عالٍ ذاكرة وصول عشوائي منخفضة
ro.lmk.psi_partial_stall_ms تمثّل هذه السمة الحد الأدنى لتعطُّل PSI الجزئي، بالملّي ثانية، الذي يؤدي إلى ظهور إشعار بانخفاض الذاكرة. إذا تلقّى الجهاز إشعارات بشأن ضغط الذاكرة متأخرًا جدًا، يمكنك خفض هذه القيمة لتفعيل الإشعارات في وقت مبكر. إذا كانت إشعارات ضغط الذاكرة يتم تشغيلها بدون داعٍ، يمكنك زيادة هذه القيمة لجعل الجهاز أقل حساسية للتشويش. 70 200
ro.lmk.psi_complete_stall_ms تمثّل هذه السمة الحدّ الأدنى لمدّة توقّف PSI، بالملّي ثانية، اللازمة لتفعيل إشعارات الذاكرة المهمّة. إذا تلقّى الجهاز إشعارات بشأن نقص الذاكرة بشكل بالغ الأهمية بعد فوات الأوان، عليك تقليل هذه القيمة لتلقّي الإشعارات في وقت مبكر. إذا كانت الإشعارات بشأن ضغط الذاكرة البالغ الأهمية يتم تشغيلها بدون داعٍ، ارفع هذه القيمة لجعل الجهاز أقل حساسية للتشويش. 700
ro.lmk.thrashing_limit الحد الأقصى لعدد أخطاء إعادة التحميل في مجموعة العمل كنسبة مئوية من إجمالي حجم ذاكرة التخزين المؤقت للصفحات المستندة إلى الملفات تعني إعادة تحميل مجموعات العمل التي تتجاوز هذه القيمة أنّ النظام يعيد تحميل ذاكرة التخزين المؤقت للصفحات بشكل متكرر. إذا تأثّر أداء الجهاز أثناء الضغط على الذاكرة، عليك خفض القيمة للحدّ من التبديل السريع بين الصفحات. إذا تم إيقاف أداء الجهاز بدون داعٍ لأسباب تتعلق بالتبديل السريع، يجب زيادة القيمة للسماح بالمزيد من التبديل السريع. 100 30
ro.lmk.thrashing_limit_decay تمثّل هذه السمة انخفاض الحدّ الأدنى للتحميل الزائد الذي يتم التعبير عنه كنسبة مئوية من الحدّ الأدنى الأصلي المستخدَم لخفض الحدّ الأدنى عندما لا يستعيد النظام حالته، حتى بعد إيقاف التطبيق. إذا كان التبديل المستمر يؤدي إلى عمليات إغلاق غير ضرورية، يجب تقليل القيمة. إذا كان الرد على التبديل السريع المستمر بعد إيقاف التطبيق بطيئًا جدًا، عليك زيادة القيمة. 10 50
ro.lmk.swap_util_max الحدّ الأقصى لمقدار الذاكرة المبدَّلة كنسبة مئوية من إجمالي الذاكرة القابلة للتبديل عندما تتجاوز الذاكرة المبدَّلة هذا الحد، يعني ذلك أنّ النظام بدّل معظم الذاكرة القابلة للتبديل ولا يزال تحت الضغط. يمكن أن يحدث ذلك عندما تؤدي عمليات التخصيص غير القابلة للتبديل إلى زيادة الضغط على الذاكرة، ولا يمكن تخفيف هذا الضغط من خلال التبديل لأنّ معظم الذاكرة القابلة للتبديل قد تم تبديلها بالفعل. القيمة التلقائية هي 100، ما يؤدي فعليًا إلى إيقاف عملية التحقّق هذه. إذا تأثّر أداء الجهاز أثناء الضغط على الذاكرة عندما يكون استخدام مساحة التبديل مرتفعًا ولم ينخفض مستوى مساحة التبديل الحرة إلى ro.lmk.swap_free_low_percentage، قلِّل القيمة للحدّ من استخدام مساحة التبديل. 100 100

تعمل عناصر التحكّم القديمة التالية أيضًا مع استراتيجية الإيقاف الجديدة.

الخاصية استخدام تلقائي
أداء عالٍ ذاكرة وصول عشوائي منخفضة
ro.lmk.swap_free_low_percentage مستوى المساحة الحرة المتاحة للتبديل كنسبة مئوية من إجمالي مساحة التبديل تستخدم عملية `lmkd` هذه القيمة كحدّ أدنى لتحديد الوقت الذي يكون فيه النظام بحاجة إلى مساحة تبديل. إذا أوقف `lmkd` العمليات عندما تكون هناك مساحة كبيرة جدًا في مساحة التبديل، قلِّل النسبة المئوية. إذا حدثت عمليات إيقاف `lmkd` متأخرة جدًا، ما يسمح بحدوث عمليات إيقاف بسبب نقص الذاكرة (OOM)، عليك زيادة النسبة المئوية. 20 10
ro.lmk.debug يؤدي ذلك إلى تفعيل سجلات تصحيح الأخطاء في `lmkd`. فعِّل تصحيح الأخطاء أثناء الضبط. false