Linux Admin - Ressourcenverwaltung mit Gruppen

cgroups oder Kontrollgruppen sind eine Funktion des Linux-Kernels, mit der ein Administrator die Systemressourcen für Dienste und auch Gruppen zuweisen oder begrenzen kann.

Um aktive Kontrollgruppen aufzulisten, die ausgeführt werden, können wir den folgenden Befehl ps verwenden :

[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

Das Ressourcenmanagement wurde ab CentOS 6.X mit der Implementierung von systemd init neu definiert . Wenn Sie an Ressourcenmanagement für Services denken, sollten Sie sich hauptsächlich auf cgroups konzentrieren .cgroupshaben mit systemd sowohl in der Funktionalität als auch in der Einfachheit Fortschritte gemacht .

Das Ziel von cgroups im Ressourcenmanagement ist, dass kein einziger Dienst das System als Ganzes herunterfahren kann. Oder kein einzelner Serviceprozess (möglicherweise ein schlecht geschriebenes PHP-Skript) beeinträchtigt die Serverfunktionalität, indem zu viele Ressourcen verbraucht werden.

cgroups ermöglichen die Ressourcensteuerung von Einheiten für die folgenden Ressourcen:

  • CPU - Begrenzen Sie CPU-intensive Aufgaben, die nicht kritisch sind, wie andere, weniger intensive Aufgaben

  • Memory - Begrenzen Sie, wie viel Speicher ein Dienst belegen kann

  • Disks - Festlegen der Festplatten-E / A.

** CPU-Zeit: **

Aufgaben, die weniger CPU-Priorität benötigen, können benutzerdefinierte konfigurierte CPU-Slices haben.

Schauen wir uns zum Beispiel die folgenden beiden Dienste an.

Höflicher CPU-Service 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]#

Böser CPU-Service 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]#

Stellen wir den höflichen Dienst mit einer geringeren CPU-Priorität ein -

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

Wie wir sehen können, verwenden beide Rogue-Prozesse über einen Zeitraum normaler Systemleerlaufzeit immer noch CPU-Zyklen. Diejenige, die weniger Zeitscheiben hat, verbraucht jedoch weniger CPU-Zeit. Vor diesem Hintergrund können wir sehen, wie die Verwendung einer kürzeren Zeitspanne wesentlichen Aufgaben einen besseren Zugriff auf die Systemressourcen ermöglichen würde.

Um Dienste für jede Ressource festzulegen , definiert die Methode set-property die folgenden Parameter:

systemctl set-property name parameter=value

CPU-Slices CPUShares
Speicherlimit MemoryLimit
Soft Memory Limit MemorySoftLimit
Block IO Gewicht BlockIOWeight
Gerätelimit blockieren (angegeben in / volume / path)) BlockIODeviceWeight
Lesen Sie IO BlockIOReadBandwidth
Disk Write IO BlockIOReadBandwidth

In den meisten Fällen werden Dienste durch CPU-Auslastung , Speicherbeschränkungen und Lese- / Schreib-E / A eingeschränkt .

Nach jeder Änderung muss systemd neu geladen und der Dienst neu gestartet werden.

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

Konfigurieren Sie CGroups unter CentOS Linux

Um benutzerdefinierte Gruppen in CentOS Linux zu erstellen, müssen Sie zuerst die Dienste installieren und konfigurieren.

Step 1 - Installieren Sie libcgroup (falls nicht bereits installiert).

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

Wie wir sehen können, ist in CentOS 7 standardmäßig libcgroup mit dem Installationsprogramm für alles installiert. Für die Verwendung eines minimalen Installationsprogramms müssen wir die Dienstprogramme libcgroup zusammen mit allen Abhängigkeiten installieren .

Step 2 - Starten und aktivieren Sie den Dienst 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]#