Android 17 e versioni successive supportano il daemon di monitoraggio della memoria dei processi (PMGD), che protegge l'integrità del sistema e l'esperienza utente gestendo in modo proattivo la memoria utilizzata per ogni processo. Il daemon migliora la stabilità complessiva del dispositivo applicando in modo graduale i limiti di memoria ai processi di destinazione specifici, verificando che i picchi o le perdite di memoria isolati non causino un peggioramento delle prestazioni a livello di sistema.
Mentre i killer di memoria insufficiente globali convenzionali agiscono solo quando l'intero sistema è sotto pressione, PMGD adotta un approccio granulare. Il daemon raggiunge questo obiettivo
monitorando i valori di memoria del gruppo di controllo v2 per i processi di destinazione.
Quando un processo di destinazione supera i limiti di memoria configurati, pmgd gestisce le violazioni dei limiti registrando gli atomi di memoria Statsd prima di terminare il processo.
Come funziona
Il daemon utilizza inotify per ascoltare gli eventi di pressione della memoria (in particolare l'attività di memoria elevata che utilizza memory.events). Quando un processo monitorato attiva un evento di memoria, pmgd esegue le seguenti azioni:
- Controllo della memoria anonima: valuta la memoria anonima del processo. Se supera il valore
anon_limit_in_mbconfigurato,pmgdtermina immediatamente il processo. - Periodo di attesa per il recupero: se la memoria anonima è inferiore al limite di memoria anonima specificato,
pmgdattende un periodo di tolleranza per il recupero del sistema (reclaim_wait_time_secs). - Valutazione della memoria dopo il recupero: se
memory.currentdel processo di destinazione rimane maggiore o uguale amemory.highdopo il periodo di tolleranza oppure la memoria anonima superaanon_limit_in_mb,pmgdtermina immediatamente il processo.
Questa operazione viene eseguita continuamente finché il processo non viene terminato o il recupero del processo non riduce la memoria utilizzata al di sotto dei limiti di memoria specificati.
Funzionalità per la salute del sistema
- Limitazione della frequenza di riavvio: per evitare loop di avvio o arresti anomali persistenti,
pmgdmonitora le terminazioni dei processi in/data/misc/pmgd/history.json. Il daemon limita i processi a una singola terminazione avviata dapmgdper ogni riavvio del dispositivo.
Configurazione SELinux
La capacità di PMGD di monitorare i processi è limitata dalle norme SELinux. Se configuri PMGD per monitorare un processo il cui dominio non è consentito dalle norme, ad esempio un processo di sistema specifico del fornitore, PMGD non può monitorarlo e potresti visualizzare negazioni SELinux in logcat.
Per consentire a PMGD di monitorare i processi in domini aggiuntivi, devi estendere le autorizzazioni di PMGD aggiornando le norme SELinux specifiche del dispositivo per PMGD.
Di seguito è riportato un esempio di file device/<vendor>/<device>/sepolicy/pmgd.te
che aggiunge l'accesso a un nuovo dominio:
# Allow pmgd to access vendor_system_apps
r_dir_file(pmgd, vendor_system_apps)
Per ulteriori informazioni sulla scrittura di norme specifiche del dispositivo, consulta Implementare SELinux.
Configurazione definita dal fornitore
La configurazione di PMGD è gestita dal fornitore e viene configurata da un file JSON obbligatorio /vendor/etc/pmgd/config.json. Questo file elenca i processi da monitorare,
il profilo del limite di memoria configurato (utilizzando
i profili delle attività cgroup),
e il limite di memoria anonima hard in megabyte.
Campi di configurazione del fornitore
La configurazione JSON fornita è un elenco di processi e relativi limiti, definiti dai seguenti campi:
| Campo | Tipo | Obbligatorio | Descrizione | Predefinito |
|---|---|---|---|---|
target_cmd |
Stringa | Sì | Il nome del comando del processo di destinazione da monitorare, ad esempio system_server. |
N/D |
uid |
Numero intero | No | L'ID utente (UID) del processo. Se omesso, pmgd applica
la regola a livello globale a qualsiasi processo corrispondente a target_cmd. |
N/D |
reclaim_wait_time_secs |
Numero intero | No | Il periodo di tolleranza in secondi da attendere prima che il sistema recuperi la memoria prima di valutare nuovamente il limite di memoria. | 5 |
mem_limit_profile |
Stringa | Sì | Il nome del profilo delle attività cgroup che imposta `memory.high`. Viene utilizzato per impostare il limite di memoria del processo. | N/D |
anon_limit_in_mb |
Numero intero | Sì | Il limite di memoria anonima definitivo in megabyte. Se l'utilizzo della memoria anonima
supera questo valore, pmgd termina immediatamente il
processo. |
N/D |
additional_task_profiles |
Elenco di stringhe | No | Un elenco di eventuali profili delle attività aggiuntivi che pmgd applica a
the process all'avvio del monitoraggio. |
Elenco vuoto |
Di seguito è riportata una configurazione di esempio del profilo delle attività cgroup in vendor/etc/task_profiles.json:
{
"Attributes": [
...
{
"Name": "MemHigh",
"Controller": "memory",
"File": "memory.high"
}
],
"Profiles": [
{
"Name": "SystemServerMemoryHighLimit",
"Actions": [
{
"Name": "SetAttribute",
"Params":
{
"Name": "MemHigh",
"Value": "1080M"
}
}
]
}
]
}
Di seguito è riportata una configurazione di esempio della configurazione PMGD in vendor/etc/pmgd/config.json:
{
"targets": [
{
"target_cmd": "system_server",
"uid": 1000,
"reclaim_wait_time_secs": 5,
"mem_limit_profile": "SystemServerMemoryHighLimit",
"anon_limit_in_mb": 300
}
]
}