GNU/Linux >> Linux Esercitazione >  >> Linux

Gestire i cgroup nel modo più difficile, manualmente

Nella prima parte, ho discusso la funzione e l'uso di cgroup per l'amministrazione del sistema e l'ottimizzazione delle prestazioni. Nella seconda parte, ho notato la complessità di cgroups e valori di CPUShares. Qui nella terza parte, mi concentro sulle attività amministrative manuali per cgroups.

Non dimenticare di leggere nella parte quattro su come funzionano i cgroup con systemd.

Fare cgroup nel modo più difficile

Diamo un'occhiata a come creare cgroup senza nessuno degli strumenti che li circondano. Nel loro cuore, i cgroup sono semplicemente una struttura di directory con cgroups montato su di essi. Possono trovarsi in qualsiasi punto del filesystem, ma troverai i cgroup creati dal sistema in /sys/fs/cgroup per impostazione predefinita. Quindi, come si creano i cgroup? Inizia creando la seguente directory di primo livello:

# mkdir -p /my_cgroups

Dopo averlo creato, decidi quali controller desideri utilizzare. Ricorda che la struttura per cgroups versione 1 è simile a questa:

/my_cgroups
├── <controller type>
│   ├── <group 1>
│   ├── <group 2>
│   ├── <group 3>

[ Ai lettori è piaciuto anche:un'introduzione a crun, un runtime di container con ingombro ridotto e veloce ]

Tutti i gruppi che desideri creare sono nidificati separatamente sotto ogni tipo di controller. Pertanto, gruppo1 sotto la memory del controller è completamente indipendente dal gruppo1 in blkio . Con questo in mente, creiamo un esempio di base CPUShares.

Per semplicità, genererò un carico sul sistema eseguendo:

# cat /dev/urandom

Ciò pone un certo carico artificiale sul sistema per una facile misurazione. Questo non è un esempio di carico reale, ma mette in evidenza i punti principali di CPUShares. Ho anche configurato una macchina virtuale che esegue CentOS 8 con una singola vCPU per rendere la matematica davvero semplice. Con questo in mente, il primo passo è creare alcune directory per i nostri controller cgroup:

# mkdir -p /my_cgroups/{memory,cpusets,cpu}

Quindi, monta i cgroup in queste cartelle:

# mount -t cgroup -o memory none /my_cgroups/memory
# mount -t cgroup -o cpu,cpuacct none /my_cgroups/cpu
# mount -t cgroup -o cpuset none /my_cgroups/cpusets

Per creare i tuoi cgroup, crea semplicemente una nuova directory sotto il controller che desideri utilizzare. In questo caso, ho a che fare con il file cpu.shares , che si trova nella cpu directory. Quindi creiamo un paio di cgroup sotto la cpu controllore:

# mkdir -p /my_cgroups/cpu/{user1,user2,user3}

Si noti che le directory vengono popolate automaticamente dal controller:

# ls -l /my_cgroup/cpu/user1/
-rw-r--r--. 1 root root 0 Sep  5 10:26 cgroup.clone_children
-rw-r--r--. 1 root root 0 Sep  5 10:26 cgroup.procs
-r--r--r--. 1 root root 0 Sep  5 10:26 cpuacct.stat
-rw-r--r--. 1 root root 0 Sep  5 10:26 cpuacct.usage
-r--r--r--. 1 root root 0 Sep  5 10:26 cpuacct.usage_all
-r--r--r--. 1 root root 0 Sep  5 10:26 cpuacct.usage_percpu
-r--r--r--. 1 root root 0 Sep  5 10:26 cpuacct.usage_percpu_sys
-r--r--r--. 1 root root 0 Sep  5 10:26 cpuacct.usage_percpu_user
-r--r--r--. 1 root root 0 Sep  5 10:26 cpuacct.usage_sys
-r--r--r--. 1 root root 0 Sep  5 10:26 cpuacct.usage_user
-rw-r--r--. 1 root root 0 Sep  5 10:26 cpu.cfs_period_us
-rw-r--r--. 1 root root 0 Sep  5 10:26 cpu.cfs_quota_us
-rw-r--r--. 1 root root 0 Sep  5 10:26 cpu.rt_period_us
-rw-r--r--. 1 root root 0 Sep  5 10:26 cpu.rt_runtime_us
-rw-r--r--. 1 root root 0 Sep  5 10:20 cpu.shares
-r--r--r--. 1 root root 0 Sep  5 10:26 cpu.stat
-rw-r--r--. 1 root root 0 Sep  5 10:26 notify_on_release
-rw-r--r--. 1 root root 0 Sep  5 10:23 tasks

Ora che ho impostato alcuni cgroup, è tempo di generare un po' di carico. Per questo, apro semplicemente tre sessioni SSH ed eseguo il seguente comando in primo piano:

# cat /dev/urandom

Puoi vedere i risultati in top :

NOTA IMPORTANTE :Ricorda che le CPUShares sono basate sul cgroup di livello superiore, che non è vincolato per impostazione predefinita. Ciò significa che se un processo più in alto nell'albero richiede CPUShares, il sistema darà la priorità a quel processo. Questo può confondere le persone. È fondamentale avere una rappresentazione visiva del layout di cgroup su un sistema per evitare confusione.

Nello screenshot qui sopra, puoi vedere tutto il cat i processi ricevono più o meno la stessa quantità di tempo della CPU. Questo perché, per impostazione predefinita, ai cgroup viene assegnato un valore 1024 in cpu.shares . Queste condivisioni sono vincolate dalla relazione del genitore con altri cgroup, come discusso in precedenza. Nel nostro esempio, non ho regolato il peso di nessuno dei genitori. Pertanto, se tutti i cgroup padre richiedono risorse contemporaneamente, si applica il peso predefinito di 1024 CPUShares.

Tornando al nostro esempio, ho creato un cgroup con alcuni valori predefiniti. Ciò significa che ogni gruppo ha il peso predefinito di 1024. Per cambiarlo, cambia semplicemente i valori in cpu.shares file:

# echo 2048 > user1/cpu.shares
# echo 768 > user2/cpu.shares
# echo 512 > user3/cpu.shares

Eccellente, ora ho un calcolo di ponderazione più complicato, ma in realtà non ho aggiunto alcun processo al cgroup. Pertanto, il cgroup è inattivo. Per aggiungere un processo a un cgroup, aggiungi semplicemente il PID desiderato alle tasks file:

# echo 2023 > user1/tasks

Ecco il risultato dell'aggiunta di un processo in un cgroup come visto in top :

Come puoi vedere nello screenshot qui sopra, il processo nel nuovo cgroup riceve circa la metà del tempo della CPU. Ciò è dovuto all'equazione di prima:

Andiamo avanti e aggiungiamo gli altri due processi nei rispettivi cgroup e osserviamo i risultati:

# echo 2024 > user2/tasks
# echo 2025 > user3/tasks

Ora vediamo che la ponderazione ha avuto effetto, con il cgroup user1 occupando circa il 61% del tempo della CPU:

Il tempo rimanente viene suddiviso tra utente2 e utente3 .

Ci sono, ovviamente, diversi problemi con la nostra configurazione di prova.

  1. Questi sono tutti creati a mano. Cosa succede se il processo che stai inserendo in un cgroup cambia il suo PID?
  2. I file e le cartelle personalizzati creati non sopravviveranno al riavvio.
  3. Questo è molto lavoro manuale. Dov'è l'attrezzatura?

Non abbiate paura, amici miei, systemd ti copre.

[ Corso online gratuito:panoramica tecnica di Red Hat Enterprise Linux. ] 

Concludi

Ora che comprendiamo meglio l'amministrazione manuale di cgroups, possiamo apprezzare meglio il valore di cgroups e systemd che lavorano insieme. Esaminerò quell'idea nella quarta parte di questa serie. Per inciso, la quarta parte è la conclusione.


Linux
  1. Gestire le risorse con cgroup in systemd

  2. Disabilita l'accesso con l'account root

  3. Come funzionano gli interni di Sudo?

  4. Esiste il comando inverso di taglio?

  5. La funzione di root del gruppo utente??

Gestione dello swap nel moderno sistema Linux

Gestire cgroup con systemd

Come eseguire un comando come amministratore di sistema (root)?

Linux:la barra (/) fa parte del nome della directory principale di Linux?

Come modificare la password di root in Linux

CentOS / RHEL 5,6:come modificare il fuso orario