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

تقوم عملية Android Low Memory Killer ( lmkd ) بمراقبة حالة الذاكرة لنظام Android قيد التشغيل وتتفاعل مع ضغط الذاكرة المرتفع عن طريق إيقاف العمليات الأقل أهمية للحفاظ على أداء النظام عند مستويات مقبولة.

حول ضغط الذاكرة

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

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

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

يدعم نظام Android 10 والإصدارات الأحدث وضع lmkd الجديد الذي يستخدم شاشات معلومات توقف ضغط kernel (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 تتطلب دعم kernel، يجب أن تتضمن kernel تصحيحات المنفذ الخلفي لـ PSI وأن يتم تجميعها مع تمكين دعم PSI ( CONFIG_PSI=y ).

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

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

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

مساحة المستخدم lmkd

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

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

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

CONFIG_ANDROID_LOW_MEMORY_KILLER=n
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y

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

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

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

يمكنك تكوين استراتيجية القتل باستخدام خاصية ro.config.low_ram . لمزيد من التفاصيل، راجع تكوين ذاكرة الوصول العشوائي المنخفضة .

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

تكوين لمكد

قم بتكوين lmkd لجهاز معين باستخدام الخصائص التالية.

ملكية يستخدم تقصير
ro.config.low_ram حدد ما إذا كان الجهاز ذو ذاكرة وصول عشوائي منخفضة أو جهاز عالي الأداء. false
ro.lmk.use_psi استخدم شاشات PSI (بدلاً من أحداث vmpressure ). true
ro.lmk.use_minfree_levels استخدم حدود الذاكرة الحرة وذاكرة التخزين المؤقت للملفات لاتخاذ قرارات إنهاء العملية (أي مطابقة وظيفة برنامج تشغيل LMK الموجود في kernel). 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

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

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

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

بالنسبة للأجهزة التي تعمل بنظام التشغيل Android 11، يتطلب lmkd ميزات kernel التالية:

  • قم بتضمين تصحيحات 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