Administrateur Linux - Gestion des ressources avec des crgoups

cgroups ou groupes de contrôle sont une caractéristique du noyau Linux qui permet à un administrateur d'allouer ou plafonner les ressources du système pour les services et aussi le groupe.

Pour lister les groupes de contrôle actifs en cours d'exécution, nous pouvons utiliser la commande ps suivante -

[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 gestion des ressources, à partir de CentOS 6.X, a été redéfinie avec l' implémentation systemd init . En pensant à la gestion des ressources pour les services, la principale chose sur laquelle se concentrer sont les groupes de contrôle .cgroupsont avancé avec systemd en termes de fonctionnalité et de simplicité.

Le but des groupes de contrôle dans la gestion des ressources est qu'aucun service ne peut arrêter le système dans son ensemble. Ou aucun processus de service unique (peut-être un script PHP mal écrit) ne paralysera la fonctionnalité du serveur en consommant trop de ressources.

Les cgroups permettent le contrôle des ressources des unités pour les ressources suivantes -

  • CPU - Limitez les tâches intensives du processeur qui ne sont pas critiques comme d'autres tâches moins intensives

  • Memory - Limiter la quantité de mémoire qu'un service peut consommer

  • Disks - Limiter les E / S disque

** Temps CPU: **

Les tâches nécessitant moins de priorité de processeur peuvent avoir des tranches de processeur configurées de manière personnalisée.

Jetons un coup d'œil aux deux services suivants par exemple.

Service CPU poli 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]#

Service CPU maléfique 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]#

Définissons Polite Service en utilisant une priorité CPU moindre -

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

Comme nous pouvons le voir, sur une période de temps d'inactivité normal du système, les deux processus non fiables utilisent toujours des cycles de processeur. Cependant, celui défini pour avoir moins de tranches de temps utilise moins de temps CPU. Dans cet esprit, nous pouvons voir comment l'utilisation d'une tranche de temps moindre permettrait aux tâches essentielles de mieux accéder aux ressources du système.

Pour définir des services pour chaque ressource, la méthode set-property définit les paramètres suivants -

systemctl set-property name parameter=value

Tranches de processeur CPUShares
Limite de mémoire MemoryLimit
Limite de mémoire souple MemorySoftLimit
Bloquer le poids d'E / S BloquerIOWeight
Bloquer la limite de périphérique (spécifié dans / volume / chemin)) BlockIODeviceWeight
Lire IO BlockIOReadBandwidth
E / S d'écriture sur disque BlockIOReadBandwidth

Le plus souvent, les services seront limités par l'utilisation du processeur , les limites de la mémoire et les E / S en lecture / écriture .

Après avoir changé chacun, il est nécessaire de recharger systemd et de redémarrer le service -

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

Configurer CGroups dans CentOS Linux

Pour créer des groupes de contrôle personnalisés dans CentOS Linux, nous devons d'abord installer les services et les configurer.

Step 1 - Installez libcgroup (s'il n'est pas déjà installé).

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

Comme nous pouvons le voir, par défaut, CentOS 7 a libcgroup installé avec l' installateur de tout . L'utilisation d'un programme d'installation minimal nous obligera à installer les utilitaires libcgroup avec toutes les dépendances.

Step 2 - Démarrez et activez le service 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]#