Product SiteDocumentation Site

3.4. cpuset

Il sottosistema cpuset assegna le CPU individuali ed i nodi di memoria ai cgroup. Ogni cpuset può essere specificata seguendo i seguenti parametri, ognuno in uno pseudofile separato all'interno del file system virtuale del cgroup:

Parametri necessari

Alcuni sottosistemi hanno parametri obbligatori che dovono essere impostati, prima di spostare un task in un cgroup che utilizzi i suddetti sottosistemi. Per esempio, prima di spostare un task in un cgroup che utilizza il sottosistema cpuset, i parametri cpuset.cpus e cpuset.mems devono essere definiti per quel cgroup.
cpuset.cpus (obbligatorio)
specifica le CPU a cui hanno accesso i task in questo cgroup. Si tratta di un elenco, separato da virgole, in formato ASCII, con trattini ("-") per gli intervalli. Per esempio,
0-2,16
rappresenta le CPU 0, 1, 2, e 16.
cpuset.mems (obbligatorio)
specifica i nodi di memoria a cui hanno accesso i task in questo cgroup. Si tratta di un elenco, separato da virgole, in formato ASCII, con trattini ("-") per rappresentare gli intervalli. Per esempio,
0-2,16
rappresenta i nodi di memoria 0, 1, 2, e 16.
cpuset.memory_migrate
contiene un flag (0 o 1) che specifica se una pagina in memoria deve essere migrata su di un nuovo nodo quando i valori in cpuset.mems cambiano. Per impostazione predefinita la migrazione è disabilitata (0), in tal modo le pagine restano sul nodo assegnato originariamente, anche se non coincide con uno dei nodi specificati in cpuset.mems. Al contrario, se abilitata (1), il sistema eseguirà la migrazione delle pagine sui nodi di memoria, nei nuovi parametri specificati da cpuset.mems, mantenendo se possibile la loro posizione relativa — per esempio, le pagine nel secondo nodo dell'elenco inizialmente specificate da cpuset.mems, verranno assegnate al secondo nodo nell'elenco ora specificato da cpuset.mems, se la posizione è disponibile.
cpuset.cpu_exclusive
contiene un flag (0 o 1) che specifica se altri cpuset diversi da questo e dai figli o genitori sono in grado di condividere le CPU specificate per questo cpuset. Per impostazione predefinita (0), le CPU non sono assegnate esclusivamente ad un cpuset.
cpuset.mem_exclusive
contiene un flag (0 o 1) che specifica se altri cpuset possono condividere i nodi di memoria specificati per questo cupset. Per impostazione predefinita (0), i nodi di memoria non sono allocati esclusivamente ad un cpuset. Riservare i nodi di memoria per uso esclusivo di un cpuset (1) è funzionalmente lo stesso che abilitare un hardwall di memoria con il parametro cpuset.mem_hardwall.
cpuset.mem_hardwall
contiene un flag (0 or 1) che specifica se le allocazioni di pagine di memoria del kernel e i dati del buffer dovrebbero essere ristretti ai nodi di memoria specificati per questo cpuset. Per impostazione predefinita (0), le pagine ed i dati del buffer sono condivisi tra processi appartenenti ad utenti multipli. Con un hardwall abilitato (1), ciascuna allocazione utente dei task può essere tenuta separata.
cpuset.memory_pressure
un file di sola lettura che contiene una media di esecuzione della memory pressure creata dai processi presenti in questo cpuset. Il valore in questo pseudofile viene automaticamente aggiornato quando cpuset.memory_pressure_enabled è aggiornato, in caso contrario, lo pseudofile contiene il valore 0.
cpuset.memory_pressure_enabled
contiene un flag (0 o 1) che specifica se il sistema deve elaborare il memory pressure creato dai processi in questo cgroup. I valori elaborati diventano output per cpuset.memory_pressure, e rappresentano il tasso con cui i processi cercano di liberare la memoria in-uso, riportati con un valore intero di tentativi di riavere la memoria, espresso in secondi, moltiplicato per 1000.
cpuset.memory_spread_page
contiene un flag (0 o 1) che specifica se i buffer di file system devono essere estesi in modo uniforme su tutti i nodi di memoria assegnati a questo cpuset. Per impostazione predefinita (0), non viene eseguito alcun tentativo di estendere in modo uniforme le pagine di memoria per questi buffer, posizionando gli stessi sullo stesso nodo sul quale il processo che li ha creati è in esecuzione.
cpuset.memory_spread_slab
contiene un flag (0 o 1) che specifica se gli slab cache del kernel per operazioni di input/output su file devono essere estesi uniformemente sul cpuset. Per impostazione predefinita (0), non viene eseguito alcun tentativo di estendere uniformemente gli slab cache del kernel, posizionando gli stessi sullo stesso nodo sul quale il processo che li ha creati è in esecuzione.
cpuset.sched_load_balance
contiene un flag (0 o 1) che specifica se il kernel bilancerà i carichi tra le CPU in questo cpuset. Per impostazione predefinita (1), il kernel esegue il bilanciamento dei carichi spostando i processi dalle CPU sovraccariche ad altre CPU con meno carico.
Da notare, che l'impostazione di questo flag in un cgroup non ha alcun effetto se il bilanciamento di carico è abilitato in un cgroup genitore, poiché il bilanciamento di carico è già in esecuzione ad un livello superiore. Quindi, per disabilitare il bilanciamento di carico in un cgroup, disabilitare il bilanciamento anche in ogni genitore presente nella gerarchia. In questo caso, si dovrebbe considerare anche se abilitare il bilanciamento su altri parenti del cgroup in questione.
cpuset.sched_relax_domain_level
contiene un valore intero tra -1 ed un valore positivo piccolo, che rappresenta la larghezza della gamma delle CPU attraverso le quali il kernel cercherà di eseguire il bilanciamento di carico. Questo valore non avrà alcun significato se cpuset.sched_load_balance è disabilitato.
L'effetto preciso di questo valore varia in base all'architettura del sistema, ma i seguenti sono valori tipici:
Valori di cpuset.sched_relax_domain_level
ValoreEffetto
-1Usa il valore predefinito di sistema per il bilanciamento di carico
0Non eseguire il bilanciamento immediato di carico; esegue questa operazione solo periodicamente
1Bilancia i carichi immediatamente attraverso i thread sullo stesso core
2Bilancia i carichi immediatamente attraverso i core nello stesso pacchetto
3Bilancia i carichi immediatamente attraverso le CPU sullo stesso nodo o componente
4Bilancia i carichi immediatamente attraverso varie CPU su architetture con NUMA (Non-Uniform Memory Access)
5Bilancia i carichi immediatamente attraverso tutte le CPU su architetture con NUMA