يعمل البرنامج الخفي لاختراق الذاكرة المنخفض (lmkd
) في Android على مراقبة الذاكرة
تعمل على نظام Android وتتفاعل مع ارتفاع ضغط الذاكرة من خلال قتل
أقل العمليات الأساسية لإبقاء النظام يعمل بالشكل المقبول
المستويات.
معلومات عن ضغط الذاكرة
قد يواجه نظام Android الذي يقوم بعمليات متعددة بالتوازي الحالات التي تستنفد فيها ذاكرة النظام والعمليات التي تتطلب المزيد حدوث تأخيرات ملحوظة في الذاكرة. ضغط الذاكرة، وهو حالة يحدث فيها أوشكت ذاكرة النظام على النفاد، مما يتطلب من Android إخلاء مساحة في الذاكرة (للتخفيف من الضغط) عن طريق تقييد أو إنهاء العمليات غير المهمة، وطلب عمليات لتحرير الموارد المخزنة مؤقتًا غير المهمة، وهكذا.
كان نظام Android يراقب في السابق ضغط ذاكرة النظام باستخدام نواة
أحد برامج التشغيل القاتلة للذاكرة (LMK)، وهو آلية صلبة تعتمد على البرامج الثابتة الترميز
القيم. بدءًا من kernel 4.12، تمت إزالة برنامج تشغيل LMK من التحميل
kernel وUserspace lmkd
في مراقبة الذاكرة وإيقاف العمليات
المهام.
معلومات حول كشك الضغط
يتوافق نظام التشغيل Android 10 والإصدارات الأحدث مع وضع lmkd
جديد.
تستخدم معلومات كشك ضغط النواة (PSI) لمراقبة ضغط الذاكرة
الرصد. حزمة تصحيح PSI في النواة الرئيسية (بإصدارات 4.9 و4.14)
kernels) يقيس مقدار الوقت الذي يتم تأخر فيه المهام نتيجة
نقص الذاكرة. ولأن هذه التأخيرات تؤثر بشكل مباشر على تجربة المستخدم،
مقياسًا مناسبًا لتحديد شدة ضغط الذاكرة. تشير رسالة الأشكال البيانية
تتضمن النواة kernel أيضًا أجهزة مراقبة PSI التي تسمح بمساحة مستخدم مميزة
(مثل lmkd
) لتحديد الحد الأدنى لهذه التأخيرات
الاشتراك في الأحداث من النواة عند اختراق أحد الحدود.
أدوات مراقبة PSI مقابل إشارات vmpression
وذلك لأنّ إشارات "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 kernel على حدود الذاكرة الحرة، مع عدم وجود تحجيم على ضغط الذاكرة.
- بسبب صرامة التصميم، غالبًا ما خصّص الشركاء السائق بحيث يمكن استخدامها على أجهزتهم.
- تم إدخال سائق LMK في واجهة برمجة تطبيقات تقليم الشرائح، والتي لم تكن
مصمَّمة للعمليات الشاقة مثل البحث عن الأهداف والقتل
ما أدّى إلى إبطاء عملية
vmscan
.
مساحة المستخدم lmkd
تنفِّذ مساحة المستخدم lmkd
الوظائف نفسها التي ينفِّذها برنامج التشغيل داخل النواة.
ولكنه يستخدم آليات kernel الحالية لاكتشاف ضغط الذاكرة وتقديره. مثل
تشمل الآليات استخدام أحداث vmpressure
التي يتم إنشاؤها بالنواة أو أداة إيقاف الضغط.
(PSI) للحصول على إشعارات حول مستويات ضغط الذاكرة،
واستخدام ميزات مجموعات الذاكرة لتحديد موارد الذاكرة المخصصة لكل منها
العملية بناءً على أهمية العملية.
استخدام مساحة المستخدم lmkd في Android 10
في الإصدار 9 من نظام Android والإصدارات الأحدث، يتم تفعيل مساحة المستخدم lmkd
في حال
لم يتم اكتشاف برنامج تشغيل LMK بالنواة. نظرًا لأن مساحة المستخدم lmkd
دعم النواة لمجموعات الذاكرة، فيجب تجميع النواة مع
إعدادات الضبط التالية:
CONFIG_ANDROID_LOW_MEMORY_KILLER=n
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y
استراتيجيات القتل
مساحة المستخدم "lmkd
" تدعم استراتيجيات الإغلاق استنادًا إلى أحداث "vmpressure
" أو مؤشر "إحصاءات Google" (PSI)
ومدى خطورتها والتلميحات الأخرى مثل استخدام رمز التبديل. قتل
بين الأجهزة ذات الذاكرة المنخفضة الأداء والأجهزة العالية الأداء:
- على الأجهزة ذات الذاكرة المنخفضة، يجب أن يتحمّل النظام ضغطًا أعلى للذاكرة وضع التشغيل العادي.
- في الأجهزة عالية الأداء، ينبغي اعتبار ضغط الذاكرة على أنه قيمة غير طبيعية ويتم إصلاحه قبل أن يؤثر على الأداء العام.
يمكنك إعداد استراتيجية القتل باستخدام السمة ro.config.low_ram
. بالنسبة
التفاصيل، راجع ذاكرة وصول عشوائي منخفضة
الضبط.
تتيح ميزة Userspace 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
|
إنهاء المهمة الأكثر تأهُّلاً (أفضل قرار) مقابل أي مهمة مؤهَّلة (قرار سريع). | true
|
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
Userspace lmkd في نظام Android 11
يحسّن Android 11 من "lmkd
" من خلال تقديم إضافة
استراتيجية القتل. تستخدم استراتيجية القتل آلية PSI لضغط الذاكرة
الجديدة في نظام التشغيل Android 10. lmkd
بوصة
حسابات Android 11 لمستويات استخدام موارد الذاكرة
والاضطراب لمنع تعطّل الذاكرة وتدهور الأداء.
تحل استراتيجية القتل هذه محل الاستراتيجيات السابقة ويمكن استخدامها
الأجهزة ذات الأداء العالي وذاكرة الوصول العشوائي المنخفضة (Android Go).
متطلبات النواة (Kernel)
على أجهزة Android 11، تتطلّب ميزة lmkd
توفُّر ميزات النواة التالية:
- تضمين تصحيحات PSI وتفعيل PSI (المنافذ الخلفية متاحة في نواة Android الشائعة 4.9 و4.14 و4.19).
- تضمين رموز تصحيح دعم PIDFD (المنافذ الخلفية المتاحة في تطبيقات Android الشائعة kernel 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 |