Daemon killer poco memoria

Il processo del daemon Android Low memory killer (lmkd) monitora la memoria lo stato di un sistema Android in esecuzione e reagisce all'elevata pressione della memoria i processi meno essenziali per mantenere le prestazioni del sistema accettabili diversi.

Informazioni sulla pressione della memoria

Un sistema Android che esegue più processi in parallelo potrebbe riscontrare situazioni in cui la memoria di sistema è esaurita e i processi che richiedono la memoria potrebbe subire ritardi notevoli. Pressione della memoria, uno stato in cui sistema è a corto di memoria, richiede Android di liberare memoria (per ridurre pressione) limitando o interrompendo i processi non importanti, per liberare risorse non critiche memorizzate nella cache e così via.

Storicamente, Android monitorava la pressione della memoria di sistema utilizzando un sistema il driver LMK (The Low Memory Killer), un meccanismo rigido che dipende dall'hardware e i relativi valori. A partire dal kernel 4.12, il driver LMK viene rimosso dall'upstream il kernel e lo spazio utente lmkd eseguono il monitoraggio della memoria e l'interruzione dei processi attività di machine learning.

Informazioni sullo stallo della pressione

Android 10 e versioni successive supportano una nuova modalità lmkd che utilizza i monitor delle informazioni di stallo della pressione del kernel (PSI) per la pressione della memoria il rilevamento automatico. Il set di patch PSI nel kernel upstream (con backport alle versioni 4.9 e 4.14 kernel) misura quanto tempo le attività subiscono ritardi in seguito la carenza di memoria. Poiché questi ritardi influiscono direttamente sull'esperienza utente, rappresenta una metrica comoda per determinare la gravità della pressione della memoria. La Il kernel upstream include anche monitor PSI che consentono spazio utente con privilegi processi (come lmkd) per specificare le soglie di questi ritardi e si abbonano agli eventi dal kernel quando viene violata una soglia.

Monitoraggio di PSI e indicatori vmpressure

Poiché gli indicatori vmpressure (generati dal kernel per la memoria della pressione e utilizzati da lmkd) spesso includono numerosi falsi positivi, lmkd deve applicare un filtro per determinare se la memoria è sottoposta a pressione reale. Questo comporta lmkd wakeup non necessari e l'utilizzo di e risorse di calcolo. L'utilizzo dei monitoraggi PSI garantisce una memoria più precisa della pressione, riducendo al minimo l'overhead di filtraggio.

Utilizza monitor PSI

Per utilizzare i monitor PSI anziché gli eventi vmpressure, configura il parametro proprietà ro.lmk.use_psi. Il valore predefinito è true, perciò PSI monitora meccanismo predefinito di rilevamento della pressione della memoria per lmkd. Poiché PSI monitora richiedono il supporto del kernel, il kernel deve includere le patch di backport della PSI compilato con il supporto PSI abilitato (CONFIG_PSI=y).

Svantaggi del driver LMK nel kernel

Android ritira il driver LMK a causa di una serie di problemi, tra cui:

  • I dispositivi con poca RAM dovevano essere ottimizzati e anche allora ha prestazioni scadenti su carichi di lavoro con pagine cache attive basate su file di grandi dimensioni. La le prestazioni scadenti hanno provocato thrashing e nessun uccisione.
  • Il driver del kernel LMK si basava su limiti di memoria libera, senza alcuna scalabilità sulla pressione della memoria.
  • A causa della rigidità del design, i partner spesso personalizzavano in modo che funzioni sui loro dispositivi.
  • Il driver LMK si agganciava all'API slab shrinker, che non era progettato per operazioni gravose come la ricerca di obiettivi e uccisioni il che ha rallentato il processo vmscan.

Spazio utente lmkd

Lo spazio utente lmkd implementa la stessa funzionalità del driver nel kernel ma utilizza i meccanismi del kernel esistenti per rilevare e stimare la pressione della memoria. Tale i meccanismi includono l'uso di eventi vmpressure generati dal kernel o lo stallo della pressione monitor di informazioni (PSI) per ricevere notifiche sui livelli di pressione della memoria, e l'uso di funzionalità cgroup di memoria per limitare le risorse di memoria allocate processo in base all'importanza del processo.

Utilizzare lo spazio utente lmkd in Android 10

In Android 9 e versioni successive, lo spazio utente lmkd si attiva se non viene rilevato un driver LMK nel kernel. Poiché lo spazio utente lmkd richiede il supporto del kernel per la memoria cgroups, il kernel deve essere compilato con le seguenti impostazioni di configurazione:

CONFIG_ANDROID_LOW_MEMORY_KILLER=n
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y

Strategie di terminazione

Lo spazio utente lmkd supporta le strategie di eliminazione basate su eventi vmpressure o PSI monitoraggi e la loro gravità e altri suggerimenti come l'utilizzo dello scambio. Termina strategie diverse tra dispositivi con memoria ridotta e dispositivi ad alte prestazioni:

  • Sui dispositivi con poca memoria, il sistema deve tollerare una maggiore pressione di memoria modalità di funzionamento normale.
  • Sui dispositivi ad alte prestazioni, la pressione della memoria deve essere considerata come una condizione anomala. e risolto prima che influisca sulle prestazioni generali.

Puoi configurare la strategia di eliminazione utilizzando la proprietà ro.config.low_ram. Per per maggiori dettagli, consulta la sezione Memoria ridotta configurazione.

Lo spazio utente lmkd supporta anche una modalità legacy in cui prende decisioni relative all'eliminazione usando le stesse strategie del driver LMK nel kernel (ovvero, soglie di memoria e di cache dei file). Per attivare la modalità legacy, imposta il parametro ro.lmk.use_minfree_levels a true.

Configura lmkd

Configura lmkd per un dispositivo specifico utilizzando le seguenti proprietà.

Proprietà Usa Predefinito
ro.config.low_ram Specifica se si tratta di un dispositivo con RAM bassa o ad alte prestazioni. false
ro.lmk.use_psi Utilizza i monitor PSI (anziché gli eventi vmpressure). true
ro.lmk.use_minfree_levels Utilizza le soglie di memoria libera e cache file per l'interruzione del processo che corrispondono alla funzionalità dei pod LMK). false
ro.lmk.low Il punteggio minimo di oom_adj per i processi idonei uccisi a livello basso di vmpressure. 1001
(disattivato)
ro.lmk.medium Il punteggio minimo di oom_adj per i processi idonei uccisi a livello medio vmpressure. 800
(servizi memorizzati nella cache o non essenziali)
ro.lmk.critical Il punteggio minimo di oom_adj per i processi idonei ha ucciso a livello critico vmpressure. 0
(qualsiasi processo)
ro.lmk.critical_upgrade Abilita l'upgrade al livello critico. false
ro.lmk.upgrade_pressure Il numero massimo di mem_pressure a cui viene eseguito l'upgrade del livello perché il sistema esegue troppe operazioni di scambio. 100
(disattivato)
ro.lmk.downgrade_pressure Il valore minimo di mem_pressure a cui un vmpressure viene ignorato perché è ancora disponibile una quantità sufficiente di memoria libera. 100
(disattivato)
ro.lmk.kill_heaviest_task Termina l'attività idonea più pesante (la decisione migliore) rispetto a qualsiasi attività idonea (decisione rapida). true
ro.lmk.kill_timeout_ms Durata in millisecondi dopo un'interruzione se non ci sarà nessun attacco aggiuntivo fatto. 0
(disattivato)
ro.lmk.debug Attiva i log di debug di lmkd. false

Esempio di configurazione del dispositivo:

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

Spazio utente lmkd in Android 11

Android 11 migliora lmkd grazie all'introduzione di una nuova strategia di attacco. La strategia di uccisione utilizza un meccanismo PSI per la pressione della memoria introdotto in Android 10. lmkd pollici Android 11 tiene conto dei livelli di utilizzo delle risorse di memoria e il thrashing per evitare l'insufficienza di memoria e un peggioramento delle prestazioni. Questa strategia di eliminazione sostituisce le strategie precedenti e può essere utilizzata dispositivi ad alte prestazioni e con poca RAM (Android Go).

Requisiti del kernel

Per i dispositivi Android 11, lmkd richiede le seguenti funzionalità del kernel:

  • Includere patch PSI e abilitare PSI (backport disponibili in kernel comuni Android 4.9, 4.14 e 4.19).
  • Includere patch di supporto PIDFD (backport disponibili nei comuni Android kernel 4.9, 4.14, e 4.19).
  • Per i dispositivi con RAM bassa, includi cgroups di memoria.

Il kernel deve essere compilato con le seguenti impostazioni di configurazione:

CONFIG_PSI=y

Configurare lmkd in Android 11

La strategia di eliminazione della memoria in Android 11 supporta manopole di sintonia e impostazioni predefinite elencati di seguito. Queste funzionalità sono disponibili con dispositivi ad alte prestazioni e con bassa RAM.

Proprietà Usa Predefinito
Prestazioni elevate RAM insufficiente
ro.lmk.psi_partial_stall_ms La soglia di stallo parziale della PSI, in millisecondi, per l'attivazione di un livello basso notifica di memoria. Se il dispositivo riceve notifiche relative alla pressione della memoria troppo tardi, diminuisci questo valore per attivare le notifiche precedenti. Se la memoria le notifiche di pressione vengano attivate inutilmente. Aumenta questo valore per aumentare il dispositivo è meno sensibile al rumore. 70 200
ro.lmk.psi_complete_stall_ms La soglia di stallo completa della PSI, in millisecondi, per l'attivazione notifiche relative alla memoria critica. Se il dispositivo riceve memoria critica notifiche di pressione troppo tardi. Riduci questo valore per attivarle prima notifiche. Se vengono attivate notifiche relative a pressione di memoria critica aumenta inutilmente questo valore per rendere il dispositivo meno sensibile a il rumore. 700
ro.lmk.thrashing_limit La quantità massima di errori del set di lavoro come percentuale del totale dimensioni della cache di pagina supportata dal file. I errori del set di lavoro al di sopra di questo valore indicano che il sistema stia eseguendo il thrashing della cache delle pagine. Se le prestazioni del dispositivo vengono influenzate dalla pressione della memoria, dalla diminuzione il valore per limitare il thrashing. Se le prestazioni del dispositivo si interrompono inutilmente per motivi di thrashing, aumenta il valore per consentire stupefacente. 100 30
ro.lmk.thrashing_limit_decay Il decadimento della soglia di thrashing espresso come percentuale del soglia originale usata per abbassarla quando il sistema non riprendersi, anche dopo un'uccisione. Se lo schiacciamento continuo produce inutili uccide, diminuisci il valore. Se la risposta allo thrashing continuo dopo un'uccisione è troppo lenta, aumenta il valore. 10 50
ro.lmk.swap_util_max La quantità massima di memoria scambiata come percentuale del totale scambiabile la memoria. Quando la memoria scambiata supera questo limite, significa che sistema ha scambiato la maggior parte della sua memoria scambiabile ed è ancora sotto pressione. Questo può accadere quando allocazioni non scambiabili generano memoria pressione che non può essere alleviata con lo scambio perché la maggior parte delle la memoria è già stata scambiata. Il valore predefinito è 100, che di fatto disattiva questo controllo. Se le prestazioni del dispositivo vengono influenzate durante pressione della memoria mentre l'utilizzo dello scambio è elevato e il livello di scambio libero non scende a ro.lmk.swap_free_low_percentage, riduci il valore per limitare l'utilizzo dello scambio. 100 100

Anche le seguenti vecchie manopole di sintonia funzionano con la nuova strategia di uccisione.

Proprietà Usa Predefinito
Prestazioni elevate RAM insufficiente
ro.lmk.swap_free_low_percentage Il livello di scambio libero come percentuale dello spazio di scambio totale. "lmkd" utilizza questo valore come soglia per quando considerare il sistema come scambio fame di spazio. Se "lmkd" uccide mentre c'è troppo spazio nello scambio, diminuisci la percentuale. Se le uccisioni di "lmkd" avvengono troppo tardi, consenti OOM aumentare la percentuale di uccisioni. 20 10
ro.lmk.debug Questa operazione abilita i log di debug "lmkd". Attiva il debug durante l'ottimizzazione. false