شيطان الذاكرة المنخفض القاتل

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

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

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

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

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

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

تراقب PSI مقابل إشارات vmpressure

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

استخدام شاشات PSI

لاستخدام أجهزة PSI بدلا من vmpressure الأحداث، تكوين ro.lmk.use_psi الممتلكات. الافتراضي هو true ، مما يجعل المراقبين PSI آلية الافتراضي للكشف عن ضغط الذاكرة ل lmkd . لأن شاشات PSI تتطلب دعم النواة، ويجب أن يتضمن نواة بقع backport PSI ويتم تجميعها مع دعم PSI تمكين ( CONFIG_PSI=y ).

عيوب برنامج تشغيل In-kernel LMK

يعمل Android على إهمال برنامج تشغيل LMK نظرًا لعدد من المشكلات ، بما في ذلك:

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

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

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

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

في الروبوت 9 و في وقت لاحق، مساحة المستخدم lmkd ينشط إذا لم يتم الكشف عن سائق LMK في النواة. لأن مساحة المستخدم lmkd يتطلب دعم نواة لسيغروبس الذاكرة، يجب أن يكون ترجمة نواة مع إعدادات التكوين التالية:

CONFIG_ANDROID_LOW_MEMORY_KILLER=n
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y

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

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

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

يمكنك تكوين استراتيجية القتل باستخدام ro.config.low_ram الملكية (لمزيد من التفاصيل، انظر منخفضة تكوين 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 استخدم الذاكرة الفارغة وعتبات ذاكرة التخزين المؤقت للملفات لاتخاذ قرارات إنهاء العملية (أي مطابقة وظائف برنامج التشغيل in-kernel 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

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

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

متطلبات Kernel

لمدة 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 الحد الأقصى لمقدار إعادة تعيين مجموعات العمل كنسبة مئوية من إجمالي حجم الصفحة المدعومة من الملف. إعادة السداد لمجموعة العمل أعلى من هذه القيمة تعني أن النظام يُنظر إليه على أنه يتفوق على pagecache. إذا تأثر أداء الجهاز أثناء ضغط الذاكرة ، فقم بتقليل القيمة للحد من الاصطدام. إذا تم إيقاف أداء الجهاز دون داع لأسباب تعثرية ، فقم بزيادة القيمة للسماح بمزيد من الضربات. 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