Process memory guardian daemon

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:

  1. Controllo della memoria anonima: valuta la memoria anonima del processo. Se supera il valore anon_limit_in_mb configurato, pmgd termina immediatamente il processo.
  2. Periodo di attesa per il recupero: se la memoria anonima è inferiore al limite di memoria anonima specificato, pmgd attende un periodo di tolleranza per il recupero del sistema (reclaim_wait_time_secs).
  3. Valutazione della memoria dopo il recupero: se memory.current del processo di destinazione rimane maggiore o uguale a memory.high dopo il periodo di tolleranza oppure la memoria anonima supera anon_limit_in_mb, pmgd termina 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, pmgd monitora le terminazioni dei processi in /data/misc/pmgd/history.json. Il daemon limita i processi a una singola terminazione avviata da pmgd per 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 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 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 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
    }
  ]
}