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 |