Killer-Daemon mit niedrigem Speicher

Der Android Low - Memory - Killer - Daemon ( lmkd ) Prozess überwacht der Speicherzustand eines mit Android System und reagiert auf hohen Speicherdruck durch die mindestens wesentliche Prozesse Töten des System zu halten , auf einem akzeptablen Niveau durchgeführt wird .

Über Gedächtnisdruck

Bei einem Android-System, das mehrere Prozesse parallel ausführt, kann es zu Situationen kommen, in denen der Systemspeicher erschöpft ist und Prozesse, die mehr Speicher benötigen, spürbare Verzögerungen erfahren. Speicherdruck, ein Zustand , in dem das System kurz auf Speicher ausgeführt wird , erfordert Android um Speicher freizugeben ( um den Druck zu lindern) durch Drosselung oder unwichtige Prozesse zu töten, Prozesse frei nicht kritische gecached Ressourcen anfordern, und so weiter.

In der Vergangenheit überwachte Android den Systemspeicherdruck mit einem im Kernel liegenden Low Memory Killer (LMK)-Treiber, einem starren Mechanismus, der von hartcodierten Werten abhängt. Ab Kernel 4.12 wird die LMK - Treiber von dem Upstream - Kernel und die Anwenderseite entfernt lmkd Überwachungsspeichern führen und Prozess Abtöten Aufgaben.

Informationen zum Druckabriss

Android 10 und höher unterstützen einen neuen lmkd Modus, Verwendungen kernel Druckströmungsabriß Informationen (PSI) für Monitore Speicherdruckerfassung. Das PSI-Patchset im Upstream-Kernel (zurückportiert auf 4.9- und 4.14-Kernel) misst die Zeit, um die Aufgaben aufgrund von Speichermangel verzögert werden. Da sich diese Verzögerungen direkt auf die Benutzererfahrung auswirken, stellen sie eine praktische Metrik zur Bestimmung des Schweregrads des Speicherdrucks dar. Der Upstream - Kernel enthält auch PSI - Monitore , die privilegierte Anwenderseite Prozesse (wie ermöglichen lmkd ) für diese Verzögerungen Schwellenwerte zu spezifizieren und zu Ereignissen aus dem Kernel zu abonnieren , wenn ein Schwellenwert überschritten wird.

PSI-Monitore im Vergleich zu vmDrucksignalen

Da die vmpressure Signale (erzeugt durch den Kernel - Speicher für die Druckerfassung und verwendet lmkd ) oft zahlreiche falsche Positive enthalten, lmkd müssen Filterung durchführen , um festzustellen , ob der Speicher unter realen Druck. Dies führt zu unnötigem lmkd Wakeups und die Verwendung von zusätzlichen Rechenressourcen. Die Verwendung von PSI-Monitoren führt zu einer genaueren Erkennung des Speicherdrucks und minimiert den Filteraufwand.

PSI-Monitore verwenden

Um PSI Monitore statt zu verwenden vmpressure Ereignisse, konfigurieren Sie die ro.lmk.use_psi Eigenschaft. Die Standardeinstellung ist true , so dass PSI überwacht der Standardmechanismus der Speicherdruckerfassung für lmkd . Da PSI Monitore Kernel - Unterstützung erfordert, muss der Kernel das PSI Backport - Patches und mit PSI - Unterstützung aktiviert (kompiliert werden CONFIG_PSI=y ).

Nachteile des In-Kernel-LMK-Treibers

Android verwirft den LMK-Treiber aufgrund einer Reihe von Problemen, darunter:

  • Low-RAM-Geräte mussten aggressiv abgestimmt werden und würden selbst dann bei Workloads mit großen dateigestützten aktiven Pagecache schlecht funktionieren. Die schlechte Leistung führte zu Schlägen und keinen Kills.
  • Der LMK-Kerneltreiber stützte sich auf freie Speichergrenzen, ohne Skalierung basierend auf dem Speicherdruck.
  • Aufgrund der Starrheit des Designs haben Partner den Treiber oft so angepasst, dass er auf ihren Geräten funktioniert.
  • Die LMK - Treiber in die Platte shrinker API verhakt, die nicht für schwere Operationen, wie die Suche nach Ziele konzipiert und sie zu töten, die die verlangsamte vmscan Prozess.

Userspace lmkd

Die Anwenderseite lmkd implementiert die gleiche Funktionalität wie der in-Kernel - Treiber verwendet aber kernel Mechanismen bestehenden zu erkennen und schätzen Speicherdruck. Solche Mechanismen sind mit generierten Kernel vmpressure Ereignisse oder Druckströmungsabriß Informationen (PSI) überwacht Meldungen über Speicherdruckpegel zu bekommen, und Speicher cgroup Funktionen unter Verwendung der Speicherressourcen für jeden Prozess auf Prozess Bedeutung Basis zugeteilt zu begrenzen.

Verwenden von Userspace lmkd in Android 10

In Android 9 und höher, Userspace- lmkd aktiviert , wenn ein in-kernel LMK Fahrer nicht erfasst wird. Da User - Space lmkd für Speicher cgroups Kernel - Unterstützung erfordert, muss der Kernel mit den folgenden Konfigurationseinstellungen erstellt werden:

CONFIG_ANDROID_LOW_MEMORY_KILLER=n
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y

Kill-Strategien

Userspace lmkd unterstützt Strategien töten basierend auf vmpressure Ereignisse oder PSI - Monitore, deren Schweregrad und andere Hinweise wie Swap - Nutzung. Kill-Strategien unterscheiden sich zwischen Low-Memory- und High-Performance-Geräten:

  • Auf Geräten mit geringem Speicher sollte das System als normalen Betriebsmodus einen höheren Speicherdruck tolerieren.
  • Auf Hochleistungsgeräten sollte der Speicherdruck als anormale Situation angesehen und behoben werden, bevor er die Gesamtleistung beeinträchtigt.

Sie können die Kill - Strategie mit der Konfiguration ro.config.low_ram Eigenschaft (für Details siehe Low RAM - Konfiguration ).

Userspace lmkd unterstützt auch einen Legacy - Modus , in dem sie zu töten Entscheidungen mit den gleichen Strategien wie der im Kernel LMK - Treiber machen (das heißt, freier Speicher und Dateicache Schwellen). Um Legacy - Modus zu aktivieren, setzen die ro.lmk.use_minfree_levels Eigenschaft true .

lmkd . konfigurieren

Configure lmkd für ein bestimmtes Gerät mit den folgenden Eigenschaften verwendet wird .

Eigentum Verwenden Standard
ro.config.low_ram Geben Sie an, ob es sich bei dem Gerät um ein Gerät mit niedrigem RAM oder ein Hochleistungsgerät handelt. false
ro.lmk.use_psi Verwenden PSI - Monitore (statt vmpressure Ereignisse). true
ro.lmk.use_minfree_levels Verwenden Sie Schwellenwerte für freien Speicher und Datei-Cache, um Entscheidungen zum Abbrechen von Prozessen zu treffen (d. h., die Funktionalität des LMK-Treibers im Kernel abzustimmen). false
ro.lmk.low Die Mindest oom_adj Punktzahl für Prozesse geeignet sein bei niedriger getötet vmpressure Ebene. 1001
(Behinderte)
ro.lmk.medium Die Mindest oom_adj Punktzahl für Prozesse geeignet sein bei mittlerer getötet vmpressure Ebene. 800
(zwischengespeicherte oder nicht wesentliche Dienste)
ro.lmk.critical Die Mindest oom_adj Punktzahl für Prozesse geeignet getötet bei kritischer wird vmpressure Ebene. 0
(beliebiger Prozess)
ro.lmk.critical_upgrade Upgrade auf kritische Stufe aktivieren. false
ro.lmk.upgrade_pressure Die maximale mem_pressure bei dem der Pegel aktualisiert wird , weil das System zu viel Swapping. 100
(Behinderte)
ro.lmk.downgrade_pressure Der Mindest mem_pressure bei dem ein vmpressure Ereignis wird ignoriert , da genügend freier Speicherplatz noch zur Verfügung steht. 100
(Behinderte)
ro.lmk.kill_heaviest_task Beenden Sie die schwerste geeignete Aufgabe (beste Entscheidung) gegenüber einer beliebigen geeigneten Aufgabe (schnelle Entscheidung). true
ro.lmk.kill_timeout_ms Dauer in Millisekunden nach einem Kill, wenn kein weiterer Kill ausgeführt wird. 0
(Behinderte)
ro.lmk.debug Aktivieren lmkd Debug - Protokolle. false

Beispiel 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 lmkd in Android 11

11 Android verbessert die lmkd durch eine neue Tötungsstrategie einzuführen. Die Tötung Strategie verwendet einen Mechanismus für die PSI - Speicher Druckerfassung in Android 10 eingeführt lmkd in Android 11 Konten für Speicherressourcenverwendungsmengen und thrashing Speicher Verhungern und Leistungsverschlechterung zu verhindern. Diese Tötungsstrategie ersetzt frühere Strategien und kann sowohl auf Hochleistungsgeräten als auch auf Geräten mit niedrigem RAM (Android Go) verwendet werden.

Kernel-Anforderungen

Für Android 11 Geräte, lmkd erfordert die folgenden Kernel - Funktionen:

  • Fügen Sie PSI-Patches hinzu und aktivieren Sie PSI (Backports verfügbar in den gängigen Android-Kernels 4.9, 4.14 und 4.19).
  • Fügen Sie PIDFD-Unterstützungspatches hinzu (Backports in den gängigen Android-Kernels 4.9, 4.14 und 4.19).
  • Fügen Sie bei Geräten mit geringem RAM Speicher-Cgroups hinzu.

Der Kernel muss mit den folgenden Konfigurationseinstellungen kompiliert werden:

CONFIG_PSI=y

lmkd in Android 11 konfigurieren

Die Memory Killing-Strategie in Android 11 unterstützt die unten aufgeführten Tuning-Knöpfe und Standardeinstellungen. Diese Funktionen funktionieren sowohl auf Hochleistungs- als auch auf Geräten mit niedrigem RAM.

Eigentum Verwenden Standard
Hochleistung Niedriger RAM
ro.lmk.psi_partial_stall_ms Der partielle PSI-Blockierungsschwellenwert in Millisekunden zum Auslösen einer Benachrichtigung bei geringem Speicher. Wenn das Gerät Benachrichtigungen über Speicherauslastung zu spät erhält, verringern Sie diesen Wert, um frühere Benachrichtigungen auszulösen. Wenn Benachrichtigungen über Speicherauslastung unnötigerweise ausgelöst werden, erhöhen Sie diesen Wert, um das Gerät weniger geräuschempfindlich zu machen. 70 200
ro.lmk.psi_complete_stall_ms Der vollständige PSI-Blockierungsschwellenwert in Millisekunden zum Auslösen kritischer Speicherbenachrichtigungen. Wenn das Gerät Benachrichtigungen über kritischen Speicherdruck zu spät erhält, verringern Sie diesen Wert, um frühere Benachrichtigungen auszulösen. Wenn Benachrichtigungen über kritischen Speicherdruck unnötigerweise ausgelöst werden, erhöhen Sie diesen Wert, um das Gerät weniger geräuschempfindlich zu machen. 700
ro.lmk.thrashing_limit Die maximale Anzahl von Workingset-Fehlern als Prozentsatz der gesamten dateigestützten Seitencache-Größe. Workingset-Fehler oberhalb dieses Wertes bedeuten, dass das System seinen Pagecache ausnutzt. Wenn die Leistung des Geräts während des Speicherdrucks beeinträchtigt wird, verringern Sie den Wert, um das Thrashing zu begrenzen. Wenn die Leistung des Geräts durch Thrashing unnötigerweise beeinträchtigt wird, erhöhen Sie den Wert, um mehr Thrashing zu ermöglichen. 100 30
ro.lmk.thrashing_limit_decay Der Thrashing-Schwellenwertabfall, ausgedrückt als Prozentsatz des ursprünglichen Schwellenwerts, der verwendet wird, um den Schwellenwert zu senken, wenn das System selbst nach einem Kill nicht wiederhergestellt wird. Wenn kontinuierliches Dreschen unnötige Kills erzeugt, verringern Sie den Wert. Wenn die Reaktion auf kontinuierliches Dreschen nach einem Kill zu langsam ist, erhöhen Sie den Wert. 10 50
ro.lmk.swap_util_max Die maximale Größe des ausgelagerten Speichers als Prozentsatz des gesamten auslagerungsfähigen Speichers. Wenn der ausgelagerte Speicher diese Grenze überschreitet, bedeutet dies, dass das System den größten Teil seines auslagerungsfähigen Speichers ausgelagert hat und immer noch unter Druck steht. Dies kann passieren, wenn nicht austauschbare Zuweisungen Speicherdruck erzeugen, der durch Swapping nicht beseitigt werden kann, da der größte Teil des austauschbaren Speichers bereits ausgelagert ist. Der Standardwert ist 100, wodurch diese Prüfung effektiv deaktiviert wird. Wenn die Leistung der Vorrichtung während der Speicherdruck beeinflusst wird , während Swap Auslastung hoch ist und die freie Auslagerungsebene ist nicht auf dropping ro.lmk.swap_free_low_percentage , verringern den Wert zu begrenzen Swap Auslastung. 100 100

Die folgenden alten Stimmknöpfe funktionieren auch mit der neuen Tötungsstrategie.

Eigentum Verwenden Standard
Hochleistung Niedriger RAM
ro.lmk.swap_free_low_percentage Die Menge an freiem Swap als Prozentsatz des gesamten Swap-Speicherplatzes. `lmkd` verwendet diesen Wert als Schwellenwert dafür, wann das System als ausgehungert betrachtet wird. Wenn `lmkd` abbricht, während zu viel Platz im Swap vorhanden ist, verringern Sie den Prozentsatz. Wenn `lmkd`-Kills zu spät erfolgen und OOM-Kills zugelassen werden, erhöhen Sie den Prozentsatz. 20 10
ro.lmk.debug Dies aktiviert `lmkd` Debug-Logs. Debug während des Tunings aktivieren. false