Demone killer con poca memoria

Le Android poca memoria assassino demone ( lmkd monitor di processo) lo stato di memoria di un sistema Android esecuzione e reagisce alla pressione alta memoria uccidendo i processi meno essenziali per mantenere il sistema eseguendo a livelli accettabili.

Informazioni sulla pressione della memoria

Un sistema Android che esegue più processi in parallelo può riscontrare situazioni in cui la memoria di sistema è esaurita e i processi che richiedono più memoria subiscono notevoli ritardi. Pressione di memoria, uno stato in cui il sistema è in esecuzione a corto di memoria, richiede Android per liberare memoria (per alleviare la pressione) strozzando o uccidere i processi senza importanza, che richiede processi a liberare risorse memorizzate nella cache non critici, e così via.

Storicamente, Android ha monitorato la pressione della memoria di sistema utilizzando un driver LMK (Low Memory Killer) in-kernel, un meccanismo rigido che dipende da valori hardcoded. Nel kernel 4.12, il driver LMK viene rimosso dal kernel upstream e l'userspace lmkd monitoraggio memoria esegue e attività di processo uccidendo.

Informazioni sullo stallo della pressione

Android 10 e versioni successive supportano un nuovo lmkd modalità che utilizza il kernel di informazione stallo pressione (PSI) monitor per il rilevamento della pressione della memoria. Il set di patch PSI nel kernel upstream (backport ai kernel 4.9 e 4.14) misura la quantità di tempo in cui le attività vengono ritardate a causa della mancanza di memoria. Poiché questi ritardi influiscono direttamente sull'esperienza dell'utente, rappresentano una metrica conveniente per determinare la gravità della pressione della memoria. Kernel upstream comprende inoltre monitor PSI che permettono processi userspace privilegiati (come lmkd ) per specificare soglie per questi ritardi e sottoscrivere eventi dal kernel quando una soglia viene superato.

Monitor PSI rispetto ai segnali di pressione vm

Poiché i vmpressure segnali (generati dal kernel per il rilevamento della pressione memoria ed utilizzati da lmkd ) includono spesso numerosi falsi positivi, lmkd deve eseguire il filtraggio per determinare se la memoria è sotto pressione reale. Questo si traduce in inutili lmkd wakeups e l'uso delle risorse di calcolo aggiuntive. L'utilizzo dei monitor PSI consente un rilevamento della pressione della memoria più accurato e riduce al minimo il sovraccarico di filtraggio.

Utilizzo dei monitor PSI

Per utilizzare i monitor PSI invece di vmpressure eventi, configurare il ro.lmk.use_psi proprietà. Il valore predefinito è true , rendendo monitor PSI il meccanismo predefinito di rilevamento della pressione memoria per lmkd . Perché i monitor PSI richiedono il supporto kernel, il kernel deve includere le patch di backport PSI e essere compilato con supporto PSI abilitato ( CONFIG_PSI=y ).

Svantaggi del driver LMK nel kernel

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

  • I dispositivi a bassa RAM dovevano essere ottimizzati in modo aggressivo e anche in questo caso avrebbero prestazioni scarse sui carichi di lavoro con una cache di pagina attiva supportata da file di grandi dimensioni. Le scarse prestazioni hanno provocato thrashing e nessuna uccisione.
  • Il driver del kernel LMK si basava su limiti di memoria libera, senza ridimensionamento in base alla pressione della memoria.
  • A causa della rigidità del design, i partner spesso personalizzavano il driver in modo che potesse funzionare sui loro dispositivi.
  • Il conducente LMK agganciato nella API lastra strizzacervelli, che non è stato progettato per operazioni pesanti come la ricerca di obiettivi e li uccide, che hanno rallentato il vmscan processo.

Spazio utente lmkd

L'userspace lmkd implementa la stessa funzionalità del conducente kernel ma usi meccanismi kernel esistenti per rilevare e pressione di memoria stima. Tali meccanismi includono l'utilizzo di kernel generati vmpressure eventi o informazioni stallo pressione (PSI) monitor per ottenere avvisi di livelli di pressione memoria, e utilizzare le funzioni cgroup memoria per limitare le risorse di memoria assegnate a ciascun processo basato sulla rilevanza del processo.

Utilizzo di userspace lmkd in Android 10

In Android 9 e successivamente, userspace lmkd attiva se non viene rilevato un driver LMK in-kernel. Perché userspace lmkd richiede il supporto del kernel per cgroups di memoria, il kernel deve essere compilato con le impostazioni di configurazione seguente:

CONFIG_ANDROID_LOW_MEMORY_KILLER=n
CONFIG_MEMCG=y
CONFIG_MEMCG_SWAP=y

Strategie di uccisione

Userspace lmkd supporti uccidono strategie basate su vmpressure eventi o monitor PSI, la loro gravità, e altri suggerimenti, come l'utilizzo di swap. Le strategie di uccisione differiscono tra dispositivi a bassa memoria e ad alte prestazioni:

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

È possibile configurare la strategia di uccidere utilizzando la ro.config.low_ram terreno (per i dettagli, vedere Configurazione Low RAM ).

Userspace lmkd supporta anche una modalità legacy in cui prende decisioni uccidere usando le stesse strategie come il driver LMK in-kernel (soglie Cioè, free di memoria e cache file). Per attivare la modalità legacy, impostare la ro.lmk.use_minfree_levels proprietà su true .

Configurazione di lmkd

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

Proprietà Utilizzo Predefinito
ro.config.low_ram Specificare se il dispositivo è un dispositivo a bassa RAM o ad alte prestazioni. false
ro.lmk.use_psi Utilizzare i monitor PSI (invece di vmpressure eventi). true
ro.lmk.use_minfree_levels Usa la memoria libera e le soglie della cache dei file per prendere decisioni sull'uccisione del processo (ovvero, corrispondere alla funzionalità del driver LMK nel kernel). false
ro.lmk.low Il minimo oom_adj punteggio per i processi idonei a essere ucciso a bassa vmpressure livello. 1001
(Disabilitato)
ro.lmk.medium Il minimo oom_adj punteggio per i processi idonei a essere ucciso a media vmpressure livello. 800
(servizi cache o non essenziali)
ro.lmk.critical Il minimo oom_adj punteggio per i processi idonei a essere ucciso a critica vmpressure livello. 0
(qualsiasi processo)
ro.lmk.critical_upgrade Abilita l'aggiornamento al livello critico. false
ro.lmk.upgrade_pressure La massima mem_pressure in cui il livello viene aggiornato perché il sistema è scambiando troppo. 100
(Disabilitato)
ro.lmk.downgrade_pressure Il minimo mem_pressure in cui un vmpressure evento viene ignorato perché abbastanza memoria libera è ancora disponibile. 100
(Disabilitato)
ro.lmk.kill_heaviest_task Elimina l'attività ammissibile più pesante (decisione migliore) rispetto a qualsiasi attività ammissibile (decisione rapida). true
ro.lmk.kill_timeout_ms Durata in millisecondi dopo un'uccisione quando non verrà eseguita alcuna uccisione aggiuntiva. 0
(Disabilitato)
ro.lmk.debug Abilita lmkd log di debug. 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 la lmkd con l'introduzione di una nuova strategia di omicidio. La strategia uccidendo utilizza un meccanismo PSI per la rilevazione della pressione della memoria introdotta in Android 10. lmkd in Android 11 conti per livelli di utilizzo delle risorse di memoria e di santa ragione per evitare la fame memoria e degrado delle prestazioni. Questa strategia di kill sostituisce le strategie precedenti e può essere utilizzata su dispositivi sia ad alte prestazioni che a bassa RAM (Android Go).

Requisiti del kernel

Per Android 11 dispositivi, lmkd richiede le seguenti caratteristiche del kernel:

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

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

CONFIG_PSI=y

Configurazione di lmkd in Android 11

La strategia di uccisione della memoria in Android 11 supporta le manopole di sintonizzazione e le impostazioni predefinite elencate di seguito. Queste funzionalità funzionano sia su dispositivi ad alte prestazioni che su dispositivi a bassa RAM.

Proprietà Utilizzo Predefinito
Alte prestazioni RAM bassa
ro.lmk.psi_partial_stall_ms La soglia di stallo parziale PSI, in millisecondi, per l'attivazione della notifica di memoria insufficiente. Se il dispositivo riceve le notifiche di utilizzo della memoria troppo tardi, diminuire questo valore per attivare le notifiche precedenti. Se le notifiche di pressione della memoria si attivano inutilmente, aumentare questo valore per rendere il dispositivo meno sensibile al rumore. 70 200
ro.lmk.psi_complete_stall_ms La soglia di stallo PSI completo, in millisecondi, per l'attivazione delle notifiche di memoria critica. Se il dispositivo riceve le notifiche di utilizzo della memoria critica troppo tardi, diminuire questo valore per attivare le notifiche precedenti. Se le notifiche di pressione critica della memoria si attivano inutilmente, aumentare questo valore per rendere il dispositivo meno sensibile al rumore. 700
ro.lmk.thrashing_limit La quantità massima di refault del workingset come percentuale della dimensione totale della cache di pagine supportata da file. I refault del workingset al di sopra di questo valore significano che si considera che il sistema stia eseguendo il thrashing della cache delle pagine. Se le prestazioni del dispositivo vengono influenzate durante la pressione della memoria, diminuire il valore per limitare il thrashing. Se le prestazioni del dispositivo vengono interrotte inutilmente per motivi di thrashing, aumentare il valore per consentire più thrashing. 100 30
ro.lmk.thrashing_limit_decay Il decadimento della soglia di thrashing espresso come percentuale della soglia originale utilizzata per abbassare la soglia quando il sistema non si ripristina, anche dopo un'uccisione. Se il thrashing continuo produce uccisioni non necessarie, diminuisci il valore. Se la risposta al 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 della memoria scambiabile totale. Quando la memoria scambiata supera questo limite, significa che il sistema ha scambiato la maggior parte della memoria scambiabile ed è ancora sotto pressione. Ciò può accadere quando le allocazioni non sostituibili generano un carico di memoria che non può essere alleviato dallo scambio perché la maggior parte della memoria sostituibile è già stata sostituita. Il valore predefinito è 100, che disattiva effettivamente questo controllo. Se le prestazioni del dispositivo è interessato durante la pressione di memoria mentre l'utilizzazione swap è alto e il livello di scambio libero non sta cadendo a ro.lmk.swap_free_low_percentage , diminuire il valore limite all'utilizzo di swap. 100 100

Le seguenti vecchie manopole di regolazione funzionano anche con la nuova strategia di uccisione.

Proprietà Utilizzo Predefinito
Alte prestazioni RAM bassa
ro.lmk.swap_free_low_percentage Il livello di swap gratuito come percentuale dello spazio di swap totale. `lmkd` usa questo valore come soglia per considerare il sistema come affamato di spazio di swap. Se `lmkd` si interrompe mentre c'è troppo spazio nello scambio, diminuisci la percentuale. Se le uccisioni `lmkd` si verificano troppo tardi, consentendo l'esecuzione di uccisioni OOM, aumentare la percentuale. 20 10
ro.lmk.debug Ciò abilita i log di debug di `lmkd`. Abilita il debug durante l'ottimizzazione. false