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]#