تراقب عملية البرنامج الخفي 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 |