Livello di astrazione Cgroup

Android 10 e versioni successive utilizzano un gruppo di controllo (cgroup) di astrazione con i profili delle attività, che gli sviluppatori possono usare per descrivere un insieme (o insiemi) di restrizioni da applicare a un thread o a un processo. Il sistema segue le azioni prescritte dei profili delle attività per selezionare uno o più cgroups appropriati, mediante i quali vengono applicate limitazioni, e le modifiche l'insieme di funzionalità cgroup sottostante può essere creato senza influire sul software superiore diversi strati.

Informazioni su cgroups

Cgroups forniscono un meccanismo per aggregare e partizionare insiemi di attività (costituiti da processi, thread e tutti i loro futuri elementi secondari) in gruppi gerarchici con un comportamento specializzato. Android usa cgroups per controllare e tenere conto di sistema, come l'utilizzo e l'allocazione di CPU e memoria, con il supporto Kernel Linux cgroups v1 e cgroups v2.

Android 9 e versioni precedenti

In Android 9 e versioni precedenti, lo script di inizializzazione di init.rc conteneva l'insieme di disponibili, i relativi punti di montaggio e le versioni. Anche se questi possono essere è cambiato, il framework Android prevedeva l'esistenza di un insieme specifico di cgroups posizioni specifiche con una gerarchia di sottogruppi e versioni specifiche, in base al lo script. Questo ha limitato la possibilità di scegliere la versione successiva del cgroup da utilizzare, oppure di cambiare la gerarchia cgroup per usare nuove funzionalità.

Android 10 e versioni successive

Android 10 e versioni successive utilizzano cgroups con i profili delle attività:

  • Configurazione di Cgroup. Gli sviluppatori descrivono la configurazione della funzionalità cgroups nel loro cgroups.json per definire degli insiemi di cgroups, con le relative posizioni e gli attributi di montaggio. Tutti i cgroups vengono montati durante la fase di inizializzazione precoce dell'inizializzazione e il processo di sviluppo.
  • Profili delle attività. Forniscono un'astrazione che disaccoppia la funzionalità dai dettagli della sua implementazione. Framework Android applica i profili delle attività come descritto nel file task_profiles.json a un un processo o un thread utilizzando le API SetTaskProfiles e SetProcessProfiles. Queste API sono specifiche di Android 11 e versioni successive.

Per garantire la compatibilità con le versioni precedenti, le funzioni legacy set_cpuset_policy, set_sched_policy e get_sched_policy forniscono la stessa API e funzionalità, ma la loro implementazione è stata modificata in modo da utilizzare i profili delle attività. Per nuovi utilizzi casi AOSP consigliano di utilizzare le nuove API dei profili delle attività anziché le API Funzione set_sched_policy.

File di descrizione Cgroups

I gruppi C sono descritti in cgroups.json file situato nel percorso <ANDROID_BUILD_TOP>/system/core/libprocessgroup/profiles/. Ogni controller è descritto in una sottosezione e deve avere almeno quanto segue:

  • Nome definito dal campo Controller.
  • Percorso di montaggio, definito dal campo Percorso.
  • Mode, UID (ID utente) e GID (ID gruppo) che descrivono il proprietario e per i file in questo percorso (tutte facoltative).
  • Attributo facoltativo, impostato su true per consentire al sistema di ignorare il montaggio causato da un controller cgroup che il kernel non supporta per il montaggio.

File cgroups.json di esempio

L'esempio seguente mostra le descrizioni per cgroup v1 (Cgroups) e cgroup v2 (Cgroups2) controller con i rispettivi percorsi.

{
  "Cgroups": [
    {
      "Controller": "cpu",
      "Path": "/dev/cpuctl",
      "Mode": "0755",
      "UID": "system",
      "GID": "system"
    },
    {
      "Controller": "memory",
      "Path": "/dev/memcg",
      "Mode": "0700",
      "Optional": true
    }
  ],
 "Cgroups2": {
   "Path": "/sys/fs/cgroup",
   "Mode": "0755",
   "UID": "system",
   "GID": "system",
   "Controllers": [
     {
       "Controller": "freezer",
       "Path": ".",
       "Mode": "0755",
       "UID": "system",
       "GID": "system"
     }
   ]
 }
}

Questo file di esempio contiene due sezioni, Cgroups, che descrivono il gruppo cgroup v1 ) e Cgroups2 (che descrive i controller cgroup v2). Tutti I controller nella gerarchia cgroups v2 sono montati nella stessa località. Di conseguenza, la sezione Cgroups2 ha i propri elementi Path, Mode, UID e Attributi GID per descrivere la posizione e gli attributi della radice del nella gerarchia. L'attributo Path per Controller in Cgroups2 è rispetto al percorso principale. In Android 12 e versioni successive puoi definire un gruppo specificato con percorso e modalità come "Optional" impostandolo su true.

Il file cgroups.json viene analizzato come parte del processo init, durante la fase di inizializzazione e che i gruppi cgroups siano montati nelle località specificate. Per ottenere in seguito dalle posizioni di montaggio cgroup, usa la funzione API CgroupGetControllerPath.

File dei profili delle attività

La task_profiles.json si trova nel percorso <ANDROID_BUILD_TOP>/system/core/libprocessgroup/profiles/. Utilizzala per descrivere un insieme specifico di azioni da applicare a un processo o a un . Un insieme di azioni è associato al nome di un profilo, che viene utilizzato in Chiamate SetTaskProfiles e SetProcessProfiles per richiamare azioni del profilo.

File task_profile.json di esempio

{
  "Attributes": [
    {
      "Name": "MemSoftLimit",
      "Controller": "memory",
      "File": "memory.soft_limit_in_bytes"
    },
    {
      "Name": "MemSwappiness",
      "Controller": "memory",
      "File": "memory.swappiness"
    }
  ],
  "Profiles": [
    {
      "Name": "MaxPerformance",
      "Actions" : [
        {
          "Name" : "JoinCgroup",
          "Params" :
          {
            "Controller": "schedtune",
            "Path": "top-app"
          }
        }
      ]
    },
    {
      "Name": "TimerSlackHigh",
      "Actions" : [
        {
          "Name" : "SetTimerSlack",
          "Params" :
          {
            "Slack": "40000000"
          }
        }
      ]
    },
    {
      "Name": "LowMemoryUsage",
      "Actions" : [
        {
          "Name" : "SetAttribute",
          "Params" :
          {
            "Name" : "MemSoftLimit",
            "Value" : "16MB"
          }
        },
        {
          "Name" : "SetAttribute",
          "Params" :
          {
            "Name" : "MemSwappiness",
            "Value" : "150"

          }
        }
      ]
    }
  ]
  "AggregateProfiles": [
     {
       "Name": "SCHED_SP_DEFAULT",
       "Profiles": [ "TimerSlackHigh", "MaxPerformance" ]
     },
     {
       "Name": "SCHED_SP_BACKGROUND",
       "Profiles": [ "LowMemoryUsage" ]
     }
}

Assegna nomi a file cgroup specifici come voci nell'elenco Attributi. Ogni voce contiene quanto segue:

  • Il campo Nome specifica il nome dell'attributo.
  • Il campo Controller fa riferimento a un controller cgroup da cgroups.json in base al nome.
  • Il campo File consente di assegnare un nome a un file specifico all'interno di questo controller.

Gli attributi sono riferimenti nelle definizioni dei profili delle attività. Al di fuori dell'attività profili, usali solo quando il framework richiede l'accesso diretto a tali l'accesso non può essere astratto utilizzando i profili delle attività. In tutti gli altri casi, utilizzare profili delle attività; offrono un migliore disaccoppiamento tra il comportamento richiesto e dei suoi dettagli di implementazione.

La sezione Profili contiene le definizioni dei profili delle attività con le seguenti definizioni:

  • Il campo Nome definisce il nome del profilo.
  • La sezione Azioni elenca un insieme di azioni eseguite quando il profilo viene applicati. Ogni azione ha quanto segue:

    • Il campo Name specifica l'azione.
    • La sezione Parametri specifica un insieme di parametri per l'azione.

Le azioni supportate sono elencate nella tabella:

Azione Parametro Descrizione
SetTimerSlack Slack Allentamento del timer in ns
SetAttribute Name Un nome che fa riferimento a un attributo della sezione Attributi
Value Un valore da scrivere nel file rappresentato dall'attributo con nome
WriteFileFilePathpercorso del file
Valueun valore da scrivere nel file
JoinCgroup Controller Un nome del controller cgroup di cgroups.json
Path Percorso di un sottogruppo nella gerarchia del controller cgroup

Android 12 e versioni successive includono un AggregateProfiles che contiene profili aggregati, ognuno dei quali è un alias di un insieme uno o più profili. Le definizioni dei profili aggregati sono costituite da:

  • Il campo Nome specifica il nome del profilo aggregato.
  • Nel campo Profili sono elencati i nomi dei profili inclusi nel profilo aggregato.

Quando viene applicato un profilo aggregato, vengono visualizzati anche tutti i profili che lo contengono applicati automaticamente. I profili aggregati possono contenere entrambi i profili o altri profili aggregati, purché non esistano ricorsi (un profilo che include se stesso).

comando lingua init_profili attività

Un comando task_profiles in Android Init Language è disponibile per Android 12 e versioni successive per agevolare dell'attività per un processo specifico. Sostituisce writepid (deprecato in Android 12) usato per eseguire la migrazione di un di un gruppo di istanze gestite tra cgroups. Il comando task_profiles offre flessibilità modificare le implementazioni sottostanti senza alcun effetto sui livelli superiori. Nella di seguito, questi due comandi eseguono in modo efficace la stessa operazione:

  • writepid /dev/cpuctl/top-app/tasks

    Ritirato in Android 12, usato per scrivere il PID dell'attività corrente nel file /dev/cpuctl/top-app/tasks.

  • task_profiles MaxPerformance

    Unisce il processo corrente al gruppo di app principali sotto "cpu" controller (cpuctl), che comporta la scrittura del PID del processo in dev/cpuctl/top-app/tasks.

Usa sempre il comando task_profiles per eseguire la migrazione delle attività nelle gerarchie cgroup in Android 12 e versioni successive. Accetta uno o più parametri, che rappresentano nomi dei profili specificati nel file task_profiles.json.

Profili delle attività a livello di API

In Android 12 e versioni successive, puoi modificare o eseguire l'override definizioni nei file predefiniti cgroups.json e task_profiles.json, basare la modifica al livello API di Android o fare in modo che venga fornita dal fornitore della partizione di testo.

Per eseguire l'override delle definizioni in base al livello API, i seguenti file devono essere presente sul dispositivo:

  • /system/etc/task_profiles/cgroups_<API level>.json

    Da utilizzare per cgroups specifici di un livello API.

  • /system/etc/task_profiles/task_profiles_<API level>.json

    Da utilizzare per i profili specifici di un livello API.

Per eseguire l'override delle definizioni dalla partizione del fornitore, i file seguenti devono essere presenti sul dispositivo:

  • /vendor/etc/cgroups.json
  • /vendor/etc/task_profiles.json

Se un attributo o una definizione di profilo in questi file utilizza lo stesso nome di si trova nel file predefinito, la definizione del file (a livello di API o a livello di fornitore) ha la precedenza la definizione precedente. Inoltre, le definizioni a livello di fornitore hanno la precedenza Definizioni a livello di API. Se la nuova definizione ha un nuovo nome, l'insieme gli attributi o i profili vengono modificati con la nuova definizione.

Il sistema Android carica i file cgroup e task_profile nel seguente ordine:

  1. Predefinito cgroups.json e task_profiles.json .
  2. File specifici a livello di API, se presenti.
  3. File di partizione del fornitore, se presenti.

Modifiche all'API esistente

Android 10 e versioni successive mantengono le funzioni set_cpuset_policy, set_sched_policy e get_sched_policy senza modifiche all'API. Tuttavia, Android 10 sposta queste funzioni in libprocessgroup, che ora contiene tutte le funzionalità relative a cgroup.

Sebbene l'intestazione cutils/sched_policy.h esista ancora, per evitare interruzioni assicura che il nuovo codice includa un nuovo processgroup/sched_policy.h .

I moduli che utilizzano una di queste funzioni devono aggiungere una dipendenza Raccolta di libprocessgroup nel makefile. Se un modulo non utilizza altri Funzionalità di libcutils, elimina libcutils della libreria dal makefile.

API dei profili delle attività

Le API private in processgroup/processgroup.h sono definite nella tabella:

Tipo API e definizione
bool SetTaskProfiles(int tid, const std::vector& profiles)
Applica i profili attività specificati in profiles al thread specificato da un ID thread (tid) utilizzando il relativo parametro tid.
bool SetProcessProfiles(uid_t uid, pid_t pid, const std::vector& profiles)
Applica i profili delle attività specificati in profiles al processo specificato dagli ID utente e di processo utilizzando i parametri uid e pid
bool CgroupGetControllerPath(const std::string& cgroup_name, std::string* path)
Indica se esiste un controller cgroup specificato da cgroup_name; se true, imposta la variabile path sulla radice di quel cgroup
bool CgroupGetAttributePath(const std::string& attr_name, std::string* path)
Indica se esiste un attributo del profilo specificato da attr_name; se true, imposta la variabile path sul percorso del file associato a questo attributo del profilo.
bool CgroupGetAttributePathForTask(const std::string& attr_name, int tid, std::string* path)
Indica se esiste un attributo del profilo specificato da attr_name; se true, imposta la variabile path sul percorso del file associato a quell'attributo del profilo e al thread specificato dal relativo ID thread utilizzando il parametro tid.
bool UsePerAppMemcg()
Indica se il sistema è configurato per l'utilizzo di cgroups di memoria per app.