Il processo del daemon di eliminazione dei processi in caso di memoria insufficiente (lmkd
) di Android monitora lo stato della memoria di un sistema Android in esecuzione e reagisce a un'elevata pressione sulla memoria eliminando i processi meno essenziali per mantenere il sistema a livelli di prestazioni accettabili.
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 più memoria presentano ritardi evidenti. L'utilizzo intensivo della memoria, uno stato in cui il sistema sta esaurendo la memoria, richiede ad Android di liberare memoria (per alleviare la pressione) riducendo la velocità o terminando i processi non importanti, chiedendo ai processi di liberare risorse memorizzate nella cache non critiche e così via.
In passato, Android monitorava la pressione della memoria di sistema utilizzando un driver LMK (Low Memory Killer) nel kernel, un meccanismo rigido che dipende da valori hardcoded. A partire dal kernel 4.12, il driver LMK viene rimosso dal kernel upstream e lo spazio utente lmkd
esegue attività di monitoraggio della memoria e di eliminazione dei processi.
Informazioni sull'arresto anomalo della pressione
Android 10 e versioni successive supportano una nuova modalità lmkd
che utilizza i monitor PSI (Informazioni sulla stallo della pressione del kernel) per il rilevamento della pressione della memoria. Il set di patch PSI nel kernel upstream (portato in backport ai kernel 4.9 e 4.14) misura il tempo di ritardo delle attività a causa di carenze di memoria. Poiché questi ritardi influiscono direttamente sull'esperienza utente, rappresentano una metrica utile per determinare la gravità della pressione della memoria. Il kernel upstream include anche monitor PSI che consentono ai processi dello spazio utente privilegiato (come lmkd
) di specificare soglie per questi ritardi e di iscriversi agli eventi del kernel quando viene superata una soglia.
Monitor PSI rispetto agli indicatori vmpressure
Poiché gli indicatori vmpressure
(generati dal kernel per il rilevamento della pressione della memoria e utilizzati da lmkd
) includono spesso numerosi falsi positivi,lmkd
deve eseguire un filtro per determinare se la memoria è sotto pressione reale.
Ciò comporta risvegli lmkd
non necessari e l'utilizzo di risorse di calcolo aggiuntive. L'utilizzo di monitor PSI consente un rilevamento più accurato della pressione della memoria e riduce al minimo il sovraccarico dei filtri.
Utilizzare i monitor PSI
Per utilizzare i monitor PSI anziché gli eventi vmpressure
, configura la proprietà
ro.lmk.use_psi
. Il valore predefinito è true
, per cui PSI monitora il
meccanismo predefinito di rilevamento della pressione della memoria per lmkd
. Poiché i monitor PSI richiedono il supporto del kernel, il kernel deve includere le patch di backport PSI ed essere compilato con il supporto PSI abilitato (CONFIG_PSI=y
).
Svantaggi del driver LMK in-kernel
Android ritira il driver LMK a causa di una serie di problemi, tra cui:
- I dispositivi con poca RAM dovevano essere ottimizzati in modo aggressivo e, anche così, avevano un rendimento scadente sui carichi di lavoro con una cache di pagine attiva basata su file di grandi dimensioni. Le prestazioni scadenti hanno causato thrashing e nessun kill.
- Il driver del kernel LMK si basava su limiti di memoria libera, senza ridimensionamento in base all'utilizzo della memoria.
- A causa della rigidità del design, i partner spesso personalizzavano il driver in modo che funzionasse sui loro dispositivi.
- Il driver LMK si è collegato all'API di riduzione delle slab, che non è stata progettata per operazioni complesse come la ricerca e l'interruzione dei target, il che ha rallentato il processo
vmscan
.
Spazio utente lmkd
Lo spazio utente lmkd
implementa la stessa funzionalità del driver in-kernel, ma utilizza i meccanismi del kernel esistenti per rilevare e stimare la pressione della memoria. Questi meccanismi includono l'utilizzo di eventi vmpressure
generati dal kernel o di monitor di informazioni sulla stallo della pressione (PSI) per ricevere notifiche sui livelli di pressione della memoria e l'utilizzo delle funzionalità di cgroup della memoria per limitare le risorse di memoria allocate a ciascun processo in base all'importanza del processo.
Utilizzare lmkd nello spazio utente in Android 10
In Android 9 e versioni successive, lo spazio utente lmkd
si attiva se non viene rilevato un driver LMK in-kernel. Poiché lo spazio utente lmkd
richiede il supporto del kernel per i gruppi di controllo della memoria, il kernel deve essere compilato con le seguenti impostazioni di configurazione:
CONFIG_ANDROID_LOW_MEMORY_KILLER=n
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y
Terminare le strategie
Lo spazio utente lmkd
supporta le strategie di eliminazione in base agli eventi vmpressure
o ai monitor della PSI, alla loro gravità e ad altri suggerimenti come l'utilizzo dello spazio di scambio. Le strategie di eliminazione differiscono tra i dispositivi a bassa memoria e quelli ad alte prestazioni:
- Sui dispositivi con poca memoria, il sistema deve tollerare una maggiore pressione sulla memoria come modalità di funzionamento normale.
- Sui dispositivi ad alte prestazioni, l'utilizzo della memoria deve essere considerato una situazione anomala e deve essere corretto prima che influisca sul rendimento complessivo.
Puoi configurare la strategia di interruzione utilizzando la proprietà ro.config.low_ram
. Per maggiori dettagli, consulta Configurazione per poca RAM.
Lo spazio utente lmkd
supporta anche una modalità precedente in cui prende decisioni di eliminazione utilizzando le stesse strategie del driver LMK in-kernel (ovvero soglie di memoria libera e cache dei file). Per attivare la modalità legacy, imposta la proprietà ro.lmk.use_minfree_levels
su true
.
Configura lmkd
Configura lmkd
per un dispositivo specifico utilizzando le seguenti proprietà.
Proprietà | Usa | Predefinito |
---|---|---|
ro.config.low_ram
|
Specifica se il dispositivo ha poca RAM 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 della cache dei file per prendere decisioni sull'interruzione dei processi (ovvero, corrispondono alla funzionalità del driver LMK nel kernel). | false
|
ro.lmk.low
|
Il punteggio oom_adj minimo per i processi idonei all'interruzione a livello vmpressure basso.
|
1001 (disattivato) |
ro.lmk.medium
|
Il punteggio oom_adj minimo per i processi idonei all'interruzione a livello medio di vmpressure .
|
800 (servizi memorizzati nella cache o non essenziali) |
ro.lmk.critical
|
Il punteggio oom_adj minimo per i processi idonei a essere terminati a livello vmpressure critico.
|
0 (qualsiasi processo) |
ro.lmk.critical_upgrade
|
Attiva l'upgrade al livello critico. | false
|
ro.lmk.upgrade_pressure
|
Il valore mem_pressure massimo a cui viene eseguito l'upgrade del livello
perché il sistema esegue troppo swap.
|
100 (disattivato) |
ro.lmk.downgrade_pressure
|
Il valore mem_pressure minimo a cui un evento vmpressure
viene ignorato perché è ancora disponibile memoria libera sufficiente.
|
100 (disattivato) |
ro.lmk.kill_heaviest_task
|
Interrompi l'attività idonea più pesante (decisione migliore) rispetto a qualsiasi attività idonea (decisione rapida). | false
|
ro.lmk.kill_timeout_ms
|
Durata in millisecondi dopo un'uccisione quando non verrà eseguita alcuna uccisione aggiuntiva. | 0 (disattivato) |
ro.lmk.debug
|
Attiva i log di debug lmkd .
|
false
|
Configurazione di esempio 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
Lmkd nello spazio utente in Android 11
Android 11 migliora il lmkd
introducendo una nuova strategia di eliminazione. La strategia di eliminazione utilizza un meccanismo PSI per il rilevamento della pressione della memoria introdotto in Android 10. lmkd
in
Android 11 tiene conto dei livelli di utilizzo delle risorse di memoria
e del thrashing per evitare la carenza di memoria e il degrado delle prestazioni.
Questa strategia di eliminazione sostituisce le strategie precedenti e può essere utilizzata sia su dispositivi ad alte prestazioni sia su dispositivi con poca RAM (Android Go).
Requisiti del kernel
Per i dispositivi Android 11, lmkd
richiede le seguenti funzionalità del kernel:
- Includi le patch PSI e abilita PSI (backport disponibili nei kernel comuni di Android 4.9, 4.14 e 4.19).
- Sono incluse le patch di supporto per PIDFD (backport disponibili nei kernel Android common 4.9, 4.14 e 4.19).
- Per i dispositivi con poca RAM, includi i 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 le impostazioni di ottimizzazione e i valori predefiniti elencati di seguito. Queste funzionalità sono disponibili sia su dispositivi ad alte prestazioni che su dispositivi con poca RAM.
Proprietà | Usa | Predefinito | |
---|---|---|---|
Prestazioni elevate | RAM ridotta | ||
ro.lmk.psi_partial_stall_ms |
La soglia di blocco parziale PSI, in millisecondi, per attivare la notifica di memoria ridotta. Se il dispositivo riceve notifiche di pressione della memoria troppo tardi, riduci questo valore per attivare notifiche precedenti. Se le notifiche di pressione della memoria si attivano inutilmente, aumenta questo valore per rendere il dispositivo meno sensibile al rumore. | 70 |
200 |
ro.lmk.psi_complete_stall_ms |
La soglia di blocco PSI completa, in millisecondi, per attivare le notifiche di memoria critica. Se il dispositivo riceve notifiche di pressione della memoria critica troppo tardi, diminuisci questo valore per attivare le notifiche in precedenza. Se le notifiche relative alla pressione della memoria critica si attivano inutilmente, aumenta questo valore per rendere il dispositivo meno sensibile al rumore. | 700 |
|
ro.lmk.thrashing_limit |
La quantità massima del set di lavoro predefinito come percentuale della dimensione totale della cache di pagine basata su file. I refault del set di lavoro superiori a questo valore indicano che il sistema è considerato in stato di thrashing della cache di pagine. Se le prestazioni del dispositivo sono interessate durante la pressione della memoria, diminuisci il valore per limitare il thrashing. Se le prestazioni del dispositivo vengono terminate inutilmente per motivi di thrashing, aumenta il valore per consentire un maggiore thrashing. | 100 |
30 |
ro.lmk.thrashing_limit_decay |
Il decadimento della soglia di thrashing espresso in percentuale della soglia originale utilizzata per abbassare la soglia quando il sistema non si riprende, anche dopo un kill. Se il thrashing continuo produce uccisioni non necessarie, riduci il valore. Se la risposta al thrashing continuo dopo un'interruzione è troppo lenta, aumenta il valore. | 10 |
50 |
ro.lmk.swap_util_max |
La quantità massima di memoria scambiata in percentuale della memoria swappable totale. Quando la memoria scambiata supera questo limite, significa che il sistema ha eseguito lo scambio della maggior parte della memoria scambiabile ed è ancora sotto pressione.
Questo può accadere quando le allocazioni non scambiabili generano una pressione sulla memoria che non può essere alleviata mediante lo scambio perché la maggior parte della memoria scambiabile è già stata scambiata. Il valore predefinito è 100, che disattiva effettivamente questo controllo. Se le prestazioni del dispositivo sono interessate durante la pressione della memoria mentre l'utilizzo dello spazio di scambio è elevato e il livello di spazio di scambio libero non scende a ro.lmk.swap_free_low_percentage , diminuisci il valore per limitare l'utilizzo dello spazio di scambio. |
100 |
100 |
Le seguenti vecchie manopole di regolazione funzionano anche con la nuova strategia di eliminazione.
Proprietà | Usa | Predefinito | |
---|---|---|---|
Prestazioni elevate | RAM ridotta | ||
ro.lmk.swap_free_low_percentage |
Il livello di swap libero come percentuale dello spazio di swap totale. `lmkd` utilizza questo valore come soglia per stabilire quando considerare il sistema in stato di scambio di spazio insufficiente. Se "lmkd" termina quando lo spazio nello spazio di scambio è eccessivo, riduci la percentuale. Se gli arresti di "lmkd" avvengono troppo tardi, consentendo gli arresti OOM, aumenta la percentuale. | 20 |
10 |
ro.lmk.debug |
In questo modo vengono attivati i log di debug di `lmkd`. Attiva il debug durante la regolazione. | false |