تراقب عملية البرنامج الخفي lmkd حالة الذاكرة لنظام Android قيد التشغيل وتستجيب للضغط العالي على الذاكرة من خلال إيقاف العمليات الأقل أهمية للحفاظ على أداء النظام بمستويات مقبولة.
لمحة عن الضغط على الذاكرة
قد يواجه نظام Android الذي يشغّل عمليات متعدّدة بالتوازي حالات تنفد فيها ذاكرة النظام وتواجه العمليات التي تتطلّب المزيد من الذاكرة تأخيرات ملحوظة. الضغط على الذاكرة، وهي حالة يكون فيها النظام يعاني من نقص في الذاكرة، يتطلّب أن يحرّر Android الذاكرة (لتخفيف الضغط) من خلال تنظيم العمليات غير المهمة أو إيقافها، وطلب تحرير الموارد المخزّنة مؤقتًا غير الضرورية من العمليات، وما إلى ذلك.
في السابق، كان Android يراقب الضغط على ذاكرة النظام باستخدام برنامج تشغيل LMK داخل النواة، وهو آلية صارمة تعتمد على القيم المرمّزة. اعتبارًا من النواة 4.12، تمت إزالة برنامج تشغيل LMK من النواة الرئيسية، ويؤدي البرنامج lmkd في مساحة المستخدم مهام مراقبة الذاكرة وإيقاف العمليات.
معلومات عن الضغط على الذاكرة
يتوافق Android 10 والإصدارات الأحدث مع وضع جديد للبرنامج lmkd يستخدم أدوات مراقبة معلومات الضغط على الذاكرة (PSI) في النواة لرصد الضغط على الذاكرة. تقيس مجموعة تصحيحات PSI في النواة الرئيسية (التي تم نقلها إلى النواتين 4.9 و4.14) مقدار الوقت الذي تتأخر فيه المهام نتيجةً لنقص الذاكرة. بما أنّ هذه التأخيرات تؤثر بشكل مباشر في تجربة المستخدم، فإنّها تمثّل مقياسًا مناسبًا لتحديد مدى خطورة الضغط على الذاكرة. تتضمّن النواة الرئيسية أيضًا أدوات مراقبة PSI تسمح لعمليات مساحة المستخدم المميّزة (مثل lmkd) بتحديد الحدود القصوى لهذه التأخيرات والاشتراك في الأحداث من النواة عند تجاوز الحد الأقصى.
أدوات مراقبة PSI مقابل إشارات `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 يتصل بواجهة برمجة التطبيقات Slab Shrinker، التي لم يتم تصميمها للعمليات الكثيفة، مثل البحث عن الأهداف وإيقافها، ما أدى إلى إبطاء عملية
vmscan.
البرنامج lmkd في مساحة المستخدم
ينفّذ البرنامج lmkd في مساحة المستخدم الوظيفة نفسها التي يؤديها برنامج التشغيل داخل النواة، ولكنّه يستخدم آليات النواة الحالية لرصد الضغط على الذاكرة وتقديره. تتضمّن هذه الآليات استخدام أحداث vmpressure التي تنشئها النواة أو أدوات مراقبة معلومات الضغط على الذاكرة (PSI) لتلقّي إشعارات حول مستويات الضغط على الذاكرة، واستخدام ميزات مجموعة التحكّم في الذاكرة للحدّ من موارد الذاكرة المخصّصة لكل عملية استنادًا إلى أهمية العملية.
استخدام البرنامج lmkd في مساحة المستخدم في Android 10
في Android 9 والإصدارات الأحدث، يتم تفعيل البرنامج 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
|
حدِّد ما إذا كان الجهاز ذا ذاكرة وصول عشوائي منخفضة أو عالي الأداء. | 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
يحسّن Android 11 البرنامج 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` تحدث متأخرة جدًا، ما يسمح بعمليات الإيقاف بسبب نقص الذاكرة تحدث، زِد النسبة المئوية. | 20 |
10 |
ro.lmk.debug |
يؤدي ذلك إلى تفعيل سجلّات تصحيح الأخطاء للبرنامج `lmkd`. فعِّل تصحيح الأخطاء أثناء الضبط. | false |
|