Killer-Daemon mit wenig Arbeitsspeicher

Der Android-Prozess für den Killer-Daemon mit wenig Arbeitsspeicher (lmkd) überwacht den Arbeitsspeicher eines laufenden Android-Systems und reagiert auf hohe Speicherauslastung, indem es Prozesse, die am wenigsten notwendig sind, damit das System eine akzeptable Leistung erbringt Niveau.

Arbeitsspeicherauslastung

Ein Android-System, auf dem mehrere Prozesse gleichzeitig ausgeführt werden, wenn der Systemspeicher erschöpft ist und Prozesse Verzögerungen auftreten. Speicherauslastung, bei der der Das System hat zu wenig Arbeitsspeicher, sodass Android Arbeitsspeicher freigeben muss durch Drosselung oder Beendigung unwichtiger Prozesse, Prozesse zur Freigabe nicht kritischer im Cache gespeicherter Ressourcen usw.

Früher überwachte Android die Auslastung des Systemspeichers mithilfe eines In-Kernel- LK-Treiber (Low Memory Killer), ein starrer Mechanismus, der von hartcodierten Werte. Ab Kernel 4.12 wird der LMK-Treiber aus dem Upstream Der Kernel und der Userspace lmkd führen Speichermonitoring und Prozessbeendigung durch. Aufgaben.

Informationen zum Druckstall

Android 10 und höher unterstützen einen neuen lmkd-Modus, der Verwendet Kernel Hyper Stall Information (PSI)-Monitoring für Speicherauslastung -Erkennung. Der PSI-Patch im Upstream-Kernel (zurückportiert zu 4.9 und 4.14) (Kernel) misst die Zeit, die Aufgaben infolge von Speichermangel. Da sich diese Verzögerungen direkt auf die Nutzererfahrung auswirken, sind eine praktische Metrik zur Bestimmung des Schweregrads der Speicherauslastung. Die Upstream-Kernel umfasst auch PSI-Monitore, die privilegierten Benutzerbereich zulassen (z. B. lmkd), um Schwellenwerte für diese Verzögerungen festzulegen Ereignisse vom Kernel abonnieren, wenn ein Schwellenwert überschritten wurde.

PSI-Monitoring und VM6P-Signale im Vergleich

Da die vmpressure-Signale (vom Kernel für den Arbeitsspeicher generiert) und von lmkd verwendet werden, enthalten oft zahlreiche falsch positive Ergebnisse, lmkd muss eine Filterung durchführen, um festzustellen, ob der Speicher tatsächlich stark ausgelastet ist. Dies führt zu unnötigen lmkd-Wakeups und der Verwendung zusätzlicher Rechenressourcen. PSI-Monitoring führt zu genauerem Arbeitsspeicher und minimiert den Filteraufwand.

PSI-Monitore verwenden

Wenn Sie PSI-Monitore anstelle von vmpressure-Ereignissen verwenden möchten, konfigurieren Sie die ro.lmk.use_psi-Property. Die Standardeinstellung ist true, wodurch PSI das Standardmechanismus der Erkennung von Speicherauslastung für lmkd. PSI überwacht erfordert Kernel-Unterstützung, muss der Kernel die PSI-Backport-Patches enthalten und kompiliert mit aktivierter PSI-Unterstützung (CONFIG_PSI=y).

Nachteile des Kernel-LMK-Treibers

Der LMK-Treiber wird von Android aufgrund verschiedener Probleme eingestellt, darunter:

  • Geräte mit niedrigem RAM mussten aggressiv abgestimmt werden, selbst dann Die Leistung ist bei Arbeitslasten mit einem großen, dateigestützten aktiven Seitencache schlecht. Die schlechte Leistung führte zum Falten und brachte keine Kills.
  • Der LMK-Kerneltreiber beruhte auf Limits des kostenlosen Speichers, ohne skalierung auf die Speicherauslastung.
  • Aufgrund der Steifigkeit des Designs passten die Partner oft den Fahrer an damit es auf ihren Geräten funktioniert.
  • Der LMK-Treiber war in die Slab Slab Shrinker API eingebunden, was nicht für schwere Operationen wie die Suche nach Zielen und das Töten was den vmscan-Prozess verlangsamt hat.

Userspace – LKD

Der Userspace lmkd implementiert die gleichen Funktionen wie der Kernel-Treiber nutzt jedoch vorhandene Kernel-Mechanismen, um Speicherauslastung zu erkennen und abzuschätzen. Ein solches Mechanismen umfassen die Verwendung von Kernel-generierten vmpressure-Ereignissen oder einen druckbedingten Stopp. Informationsüberwachung (PSI), um Benachrichtigungen über Speicherauslastung, und die Verwendung von cgroup-Features im Arbeitsspeicher, um die jeweils zugewiesenen Arbeitsspeicherressourcen zu begrenzen, basierend auf ihrer Wichtigkeit.

Userspace-lmkd unter Android 10 verwenden

Unter Android 9 und höher wird der Nutzerbereich lmkd aktiviert, wenn Es wurde kein LMK-Treiber im Kernel erkannt. Weil der Nutzerbereich lmkd erfordert Kernel-Unterstützung für cgroups-Speicher, der Kernel muss mit dem folgenden Konfigurationseinstellungen:

CONFIG_ANDROID_LOW_MEMORY_KILLER=n
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y

Tötungsstrategien

Der Userspace lmkd unterstützt Kill-Strategien auf Grundlage von vmpressure-Ereignissen oder PSI Monitoring-Monitoring, deren Schweregrad und andere Hinweise wie die Auslagerungsauslastung. Töten Die Strategien unterscheiden sich bei Geräten mit wenig Arbeitsspeicher und Geräten mit hoher Leistung:

  • Auf Geräten mit wenig Arbeitsspeicher sollte das System eine höhere Speicherauslastung tolerieren, normalen Betriebsmodus.
  • Auf Hochleistungsgeräten sollte die Speicherauslastung als ungewöhnlich betrachtet werden. und korrigiert, bevor es sich auf die Gesamtleistung auswirkt.

Sie können die Kill-Strategie mit dem Attribut ro.config.low_ram konfigurieren. Für Weitere Informationen zu weniger RAM Konfiguration.

Der Userspace lmkd unterstützt auch einen Legacy-Modus, in dem Beendigungsentscheidungen getroffen werden. mit denselben Strategien wie der Kernel-LMK-Treiber (d. h. kostenlose Arbeitsspeicher- und Datei-Cache-Schwellenwerte). Um den Legacy-Modus zu aktivieren, legen Sie den ro.lmk.use_minfree_levels-Property zu true.

lmkd konfigurieren

Konfigurieren Sie lmkd mithilfe der folgenden Eigenschaften für ein bestimmtes Gerät.

Attribut Verwenden Standard
ro.config.low_ram Geben Sie an, ob es sich um ein Gerät mit wenig RAM oder hoher Leistung handelt. false
ro.lmk.use_psi Verwenden Sie PSI-Monitore (anstelle von vmpressure-Ereignissen). true
ro.lmk.use_minfree_levels Freig. Arbeitsspeicher und Datei-Cache-Schwellenwerte für Prozessbeend verwenden d. h., die Funktionen des Kernels LMK-Treiber). false
ro.lmk.low Der Mindestwert von oom_adj für Prozesse, die zugelassen werden können auf niedriger Stufe vmpressure getötet. 1001
(deaktiviert)
ro.lmk.medium Der Mindestwert von oom_adj für Prozesse, die zugelassen werden können getötet auf mittlerem vmpressure-Level. 800
(im Cache gespeicherte oder nicht notwendige Dienste)
ro.lmk.critical Der Mindestwert von oom_adj für Prozesse, die zugelassen werden können bei kritischem vmpressure-Level getötet. 0
(beliebiger Prozess)
ro.lmk.critical_upgrade Aktivieren Sie das Upgrade auf die kritische Ebene. false
ro.lmk.upgrade_pressure Die maximale mem_pressure, bis zu der das Level hochgestuft wird weil das System zu oft tauscht. 100
(deaktiviert)
ro.lmk.downgrade_pressure Die minimale mem_pressure, zu der ein vmpressure ignoriert, da noch genügend kostenloser Speicher verfügbar ist. 100
(deaktiviert)
ro.lmk.kill_heaviest_task Töten Sie die schwerste zulässige Aufgabe (beste Entscheidung) im Vergleich zu einer geeigneten Aufgabe (schnelle Entscheidung). true
ro.lmk.kill_timeout_ms Dauer in Millisekunden nach einem Kill, wenn kein weiterer Kill vorhanden ist fertig. 0
(deaktiviert)
ro.lmk.debug lmkd-Fehlerbehebungsprotokolle aktivieren false

Beispiel für eine Gerätekonfiguration:

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-Profil – LSKD unter Android 11

Android 11 verbessert die lmkd durch eine neue Tötungsstrategie. Bei der Kill-Strategie wird ein PSI-Mechanismus für die Speicherauslastung verwendet in Android 10 eingeführt. lmkd Zoll Android 11 berücksichtigt die Nutzungsintensitäten von Arbeitsspeicherressourcen und Seitengeflecht, um Speichermangel und Leistungseinbußen zu verhindern. Diese Tötungsstrategie ersetzt die vorherigen Strategien und kann sowohl für und Android Go-Geräten mit niedrigem RAM.

Kernel-Anforderungen

Bei Android 11-Geräten erfordert lmkd die folgenden Kernel-Features:

  • PSI-Patches einschließen und PSI aktivieren (Rückports verfügbar in Die gängigen Android-Kernel 4.9, 4.14 und 4.19.
  • PIDFD-Support-Patches einschließen (Backports, die in Android allgemein verfügbar sind) der Kernel 4.9, 4.14 und 4.19).
  • Schließen Sie für Geräte mit niedrigem RAM Arbeitsspeicher-cgroups ein.

Der Kernel muss mit den folgenden Konfigurationseinstellungen kompiliert werden:

CONFIG_PSI=y

lmkd in Android 11 konfigurieren

Die Gedächtniskiller-Strategie in Android 11 unterstützt die unten aufgeführten Feinabstimmungsregler und Standardeinstellungen. Diese Funktionen sind sowohl auf leistungsstarke Geräte mit wenig RAM.

Attribut Verwenden Standard
Hohe Leistung Geringer RAM
ro.lmk.psi_partial_stall_ms Der Grenzwert für teilweise PSI-Verzögerung in Millisekunden zum Auslösen eines niedrigen Benachrichtigung „Erinnerung“. Wenn das Gerät Benachrichtigungen zur Speicherauslastung erhält zu spät. Verringern Sie diesen Wert, um frühere Benachrichtigungen auszulösen. Wenn Arbeitsspeicher Benachrichtigungen unnötig ausgelöst werden, erhöhen Sie diesen Wert, das Gerät weniger empfindlich auf Lärm reagieren. 70 200
ro.lmk.psi_complete_stall_ms Der Schwellenwert für die vollständige PSI-Verzögerung in Millisekunden zum Auslösen wichtige Arbeitsspeicherbenachrichtigungen. Wenn das Gerät einen kritischen Arbeitsspeicher empfängt Druckbenachrichtigungen zu spät; verringern Sie diesen Wert, um früher ausgelöst zu werden Benachrichtigungen. Wenn Benachrichtigungen über kritische Arbeitsspeicherauslastung ausgelöst werden erhöhen Sie diesen Wert unnötigerweise, damit das Gerät weniger empfindlich auf Lärm. 700
ro.lmk.thrashing_limit Die maximale Anzahl von Workingset-Fehlern als Prozentsatz der Gesamtmenge Größe des dateigestützten Seitencaches. Arbeitssatz-Fehler über diesem Wert dass der Seitencache vom System überflutet wird. Wenn die Geräteleistung wird bei Auslastung des Arbeitsspeichers beeinträchtigt, Abnahme den Wert zur Begrenzung des Thrashing. Wenn die Leistung des Geräts abbricht die unnötigerweise aus Gründen der Seitenbälle auftreten, erhöhen Sie den Wert, um mehr und Websites prahlen. 100 30
ro.lmk.thrashing_limit_decay Der Abfall des Schwellenwerts für das Überklappen, ausgedrückt als Prozentsatz des ursprünglichen Grenzwert, der verwendet wird, um den Grenzwert zu senken, wenn das System selbst nach einer Tötung zu erholen. Wenn fortlaufendes Thrashing unnötige kills, verringern Sie den Wert. Wenn die Reaktion auf ständige Rauschstörungen wenn ein Kill zu langsam ist, erhöhen Sie den Wert. 10 50
ro.lmk.swap_util_max Die maximale Menge des ausgetauschten Arbeitsspeichers als Prozentsatz der gesamten anpassbaren Speicher zu speichern. Wenn der ausgetauschte Speicher diese Grenze überschreitet, dass das System den Großteil des anpassbaren Arbeitsspeichers ausgetauscht hat. Dies kann passieren, wenn nicht anpassbare Zuweisungen Arbeitsspeicher generieren was sich nicht durch einen Wechsel abbauen lässt, dass der Arbeitsspeicher bereits ausgetauscht wurde. Der Standardwert ist 100, was effektiv deaktiviert diese Prüfung. Wenn die Geräteleistung während des die Arbeitsspeicherauslastung bei hoher Auslagerungsauslastung hoch und der kostenlose Auslagerungsgrad hoch ist steigt nicht auf ro.lmk.swap_free_low_percentage, nimmt ab den Wert zur Begrenzung der Swap-Auslastung. 100 100

Die folgenden alten Feinabstimmungsknöpfe funktionieren auch bei der neuen Kill-Strategie.

Attribut Verwenden Standard
Hohe Leistung Geringer RAM
ro.lmk.swap_free_low_percentage Die Größe des kostenlosen Austauschs als Prozentsatz des gesamten Auslagerungsbereichs. „lmkd“ verwendet diesen Wert als Grenzwert, wann das System als „Swap“ betrachtet werden soll im All. Wenn „lmkd“ tötet, während zu viel Platz im Austausch ist, um den Prozentsatz zu verringern. Wenn „lmkd“-Kills zu spät auftreten, wird OOM zugelassen tötet, erhöhen Sie den Prozentsatz. 20 10
ro.lmk.debug Dadurch werden „lmkd“-Debug-Logs aktiviert. Aktivieren Sie die Fehlerbehebung während der Abstimmung. false