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 valore
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
ha ucciso 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 |