Amministratore Linux - Gestione risorse con crgoup

cgroups o Control Groups sono una funzionalità del kernel Linux che consente a un amministratore di allocare o limitare le risorse di sistema per i servizi e anche per il gruppo.

Per elencare i gruppi di controllo attivi in esecuzione, possiamo usare il seguente comando ps :

[root@localhost]# ps xawf -eo pid,user,cgroup,args 
8362 root     -                            \_ [kworker/1:2] 
1 root        -                           /usr/lib/systemd/systemd --switched-
   root --system --    deserialize 21 
507 root     7:cpuacct,cpu:/system.slice  /usr/lib/systemd/systemd-journald 
527 root     7:cpuacct,cpu:/system.slice  /usr/sbin/lvmetad -f 
540 root     7:cpuacct,cpu:/system.slice  /usr/lib/systemd/systemd-udevd 
715 root     7:cpuacct,cpu:/system.slice  /sbin/auditd -n 
731 root     7:cpuacct,cpu:/system.slice   \_ /sbin/audispd 
734 root     7:cpuacct,cpu:/system.slice       \_ /usr/sbin/sedispatch 
737 polkitd  7:cpuacct,cpu:/system.slice  /usr/lib/polkit-1/polkitd --no-debug 
738 rtkit    6:memory:/system.slice/rtki  /usr/libexec/rtkit-daemon 
740 dbus     7:cpuacct,cpu:/system.slice  /bin/dbus-daemon --system --
   address=systemd: --nofork --nopidfile --systemd-activation

La gestione delle risorse, a partire da CentOS 6.X, è stata ridefinita con l' implementazione di systemd init . Quando si pensa alla gestione delle risorse per i servizi, la cosa principale su cui concentrarsi sono i cgroup .cgroupssono avanzati con systemd sia in termini di funzionalità che di semplicità.

L'obiettivo di cgroups nella gestione delle risorse è: nessun servizio può arrestare il sistema nel suo complesso. Oppure nessun singolo processo di servizio (forse uno script PHP scritto male) paralizzerà la funzionalità del server consumando troppe risorse.

cgroups consente il controllo delle risorse delle unità per le seguenti risorse:

  • CPU - Limita le attività intensive della CPU che non sono critiche come altre attività meno intense

  • Memory - Limita la quantità di memoria che un servizio può consumare

  • Disks - Limita i / o disco

** Tempo CPU: **

Le attività che richiedono meno priorità della CPU possono avere sezioni CPU configurate personalizzate.

Diamo uno sguardo ai seguenti due servizi, ad esempio.

Servizio CPU discreto 1

[root@localhost]# systemctl cat polite.service 
# /etc/systemd/system/polite.service 
[Unit] 
Description = Polite service limits CPU Slice and Memory 
After=remote-fs.target nss-lookup.target

[Service] 
MemoryLimit = 1M 
ExecStart = /usr/bin/sha1sum /dev/zero 
ExecStop = /bin/kill -WINCH ${MAINPID} 
WantedBy=multi-user.target

# /etc/systemd/system/polite.service.d/50-CPUShares.conf 
[Service] 
CPUShares = 1024 
[root@localhost]#

Servizio CPU malvagia 2

[root@localhost]# systemctl cat evil.service 
# /etc/systemd/system/evil.service 
[Unit] 
Description = I Eat You CPU 
After=remote-fs.target nss-lookup.target

[Service] 
ExecStart = /usr/bin/md5sum /dev/zero 
ExecStop = /bin/kill -WINCH ${MAINPID} 
WantedBy=multi-user.target

# /etc/systemd/system/evil.service.d/50-CPUShares.conf 
[Service] 
CPUShares = 1024 
[root@localhost]#

Impostiamo il servizio "polite" utilizzando una priorità della CPU inferiore -

systemctl set-property polite.service CPUShares = 20  
/system.slice/polite.service
1   70.5   124.0K        -        -  

/system.slice/evil.service
1   99.5   304.0K        -        -

Come possiamo vedere, in un periodo di normale tempo di inattività del sistema, entrambi i processi non autorizzati utilizzano ancora i cicli della CPU. Tuttavia, quello impostato per avere meno intervalli di tempo utilizza meno tempo della CPU. Con questo in mente, possiamo vedere come l'utilizzo di un intervallo di tempo inferiore consentirebbe alle attività essenziali di accedere meglio alle risorse di sistema.

Per impostare i servizi per ogni risorsa, il metodo set-property definisce i seguenti parametri:

systemctl set-property name parameter=value

Fette di CPU CPUShares
Limite di memoria MemoryLimit
Limite di memoria morbida MemorySoftLimit
Blocco peso IO BlockIOWeight
Block Device Limit (specificato in / volume / path)) BlockIODeviceWeight
Leggi IO BlockIOReadBandwidth
I / O di scrittura su disco BlockIOReadBandwidth

Molto spesso i servizi saranno limitati dall'uso della CPU , dai limiti di memoria e dall'IO di lettura / scrittura .

Dopo aver cambiato ciascuno, è necessario ricaricare systemd e riavviare il servizio -

systemctl set-property foo.service CPUShares = 250 
systemctl daemon-reload 
systemctl restart foo.service

Configurare i CGroup in CentOS Linux

Per creare cgroup personalizzati in CentOS Linux, dobbiamo prima installare i servizi e configurarli.

Step 1 - Installa libcgroup (se non è già installato).

[root@localhost]# yum install libcgroup 
Package libcgroup-0.41-11.el7.x86_64 already installed and latest version 
Nothing to do 
[root@localhost]#

Come possiamo vedere, per impostazione predefinita CentOS 7 ha libcgroup installato con il programma di installazione di tutto . L'utilizzo di un programma di installazione minimo richiederà l'installazione delle utilità libcgroup insieme a qualsiasi dipendenza.

Step 2 - Avvia e abilita il servizio cgconfig.

[root@localhost]# systemctl enable cgconfig 
Created symlink from /etc/systemd/system/sysinit.target.wants/cgconfig.service 
to /usr/lib/systemd/system/cgconfig.service. 
[root@localhost]# systemctl start cgconfig 
[root@localhost]# systemctl status cgconfig 
● cgconfig.service - Control Group configuration service 
Loaded: loaded (/usr/lib/systemd/system/cgconfig.service; enabled; vendor 
preset: disabled) 
Active: active (exited) since Mon 2017-01-23 02:51:42 EST; 1min 21s ago 
Main PID: 4692 (code=exited, status = 0/SUCCESS) 
Memory: 0B 
CGroup: /system.slice/cgconfig.service  

Jan 23 02:51:42 localhost.localdomain systemd[1]: Starting Control Group 
configuration service... 
Jan 23 02:51:42 localhost.localdomain systemd[1]: Started Control Group 
configuration service. 
[root@localhost]#