برنامج خفي لقتل الذاكرة

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