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 APISetTaskProfiles
eSetProcessProfiles
. 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 | |
WriteFile | FilePath | percorso del file |
Value | un 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 indev/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:
- Predefinito
cgroups.json
etask_profiles.json
. - File specifici a livello di API, se presenti.
- 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
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
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. |