Cgroups: Unterschied zwischen den Versionen
| Zeile 326: | Zeile 326: | ||
</noinclude> | </noinclude> | ||
Version vom 13. November 2025, 13:36 Uhr
cgroup - Ressourcenkontrolle unter Linux
Beschreibung
Mit cgroups- lassen sich Ressourcen von Prozessen beschränken
- Ressourcensteuerung und -kontrolle umsetzen
Genutzten Arbeitsspeicher eines einzelnen Prozesses oder einer Gruppe von Prozessen beschränken
Ursprünglich als "process container" bezeichnet
- können die Control-Groups (kurz: cgroups) Ressourcen (Arbeitsspeicher, CPU, I/O) limitieren, priorisieren, zählen (für Abrechnungszwecke) und isolieren
Beim Einsatz etwa von KVM-Virtualisierung sehr interessant
- Mit Cgroups lassen sich die Ressourcen eines virtuellen Gastes beschränken oder gegenüber anderen Gästen priorisieren
Gruppen
Mit einer cgroup können mehrere Prozesse zu einer Gruppe zusammenfasst werden
- Diese Prozesse und sämtliche Kindprozesse kann dann mit Parametern für bestimmte Subsysteme versehen
- Ein Subsystem ist dann etwa ein Ressource-Controller, der den verfügbaren Arbeitsspeicher verwaltet
- Beispiel
Um die Cgroups zu verwenden, muss zunächst Hierarchien anlegen, in der die Gruppen verwaltet werden
Hierzu editiert er die Datei /etc/cgconfig.conf , die in zu sehen ist
- Existiert die Datei nicht, so muss er das entsprechende Paket noch installieren
Diese Datei legt für jedes Subsystem eine eigene Hierarchie an, unterhalb derer die Cgroups angelegt werden können
- Die Hierarchie /cgroup/cpu erlaubt die Verwaltung der CPU-Shares, während /cgroup/net_cls die Verwaltung der Netz-I/O-Leistung unterstützt
- /etc/cgconfig.conf
01 mount {
02 cpuset = /cgroup/cpuset;
03 cpu = /cgroup/cpu;
04 cpuacct = /cgroup/cpuacct;
05 memory = /cgroup/memory;
06 devices = /cgroup/devices;
07 freezer = /cgroup/freezer;
08 net_cls = /cgroup/net_cls;
09 ns = /cgroup/ns;
10 blkio = /cgroup/blkio;
11 }
- Cgroups-Dateisystem
Ein Start des Cgconfig-Daemons erzeugt dann die Verzeichnisse und mountet das Cgroups-Dateisystem
Mit dem Befehl lssubsys kontrolliert der Admin die korrekte Erzeugung der Hierarchien
lssubsys
01 # lssubsys -am
02 cpuset /cgroup/cpuset
03 cpu /cgroup/cpu
04 cpuacct /cgroup/cpuacct
05 memory /cgroup/memory
06 devices /cgroup/devices
07 freezer /cgroup/freezer
08 net_cls /cgroup/net_cls
09 ns /cgroup/ns
10 blkio /cgroup/blkio
- Control Group anlegen
cgcreate -g blkio:/dd
- Block-I/O-Subsystem
Parameter für das Subsystem Block-I/O
sudo cgget -g blkio /dd
/dd:
blkio.reset_stats=
blkio.io_queued=Total 0
blkio.io_merged=Total 0
blkio.io_wait_time=Total 0
blkio.io_service_time=Total 0
blkio.io_serviced=Total 0
blkio.io_service_bytes=Total 0
Seit der Version 2.6.37 unterstützt der Kernel hier auch die Optionen blkio.throttle.*
- Damit kann die maximale I/O-Bandbreite beim Lesen und Schreiben einer Prozessgruppe einschränken
Um dies zu testen, benötigt der Admin zunächst die Major- und Minor-Nummern des Gerätes, auf dem die Bandbreite eingeschränkt werden soll
Handelt es sich um /dev/sda1 , kann er diese mit einem einfachen ls ermitteln:
sudo ls -l /dev/sda1
brw-rw----. 1 root disk 8, 1 10. Okt 08:32 /dev/sda1
Hier handelt es sich um die Major/Minor-Nummern 8 respektive 1
- Um die Bandbreite für die Control-Group nun auf 1 Mbyte/s zu beschränken, verwendet er den Befehl cgset oder einfach ein echo :
echo "8:1 1048576" > /cgroup/blkio/dd/blkio.throttle.write_bps_device
Für den Test startet er nun dd
dd if=/dev/zero of=/tmp/test & pid=$!
Zunächst arbeitet der Prozess dd in der Root-Cgroup, die nicht eingeschränkt ist
- Test
Prozess ein SIGUSR1 senden
sudo kill -USR1 $pid
578804+0 Datensätze ein
578804+0 Datensätze aus
296347648 Bytes (296 MB) kopiert, 7,00803 s,42,3 MB/s
- In die Cgroup verschieben
Prozess in die Cgroup ddverschieben
sudo echo $pid > /cgroups/blkio/dd/tasks
- Erneutes USR1-Signal
- Sendet nun erneut ein USR1-Signal an den dd -Prozess
- erkennt er, dass die durchschnittliche Bandbreite stark sinkt, da der Prozess nun nur noch mit einer Bandbreite von 1 MByte/s schreiben darf
- Statt die maximale Bandbreite zu beschränken, kann der Admin auch die Bandbreiten zwischen den Gruppen priorisieren
- blkio.weight
Hierzu dient der Parameter blkio.weight=
- Der Default-Wert beträgt 500
- Erhält eine Gruppe den Wert 1000, so kann sie doppelt so häufig auf die Block-Geräte zugreifen wie die anderen Gruppen
- cgclassify
Statt des Echo-Kommandos lassen sich Prozesse auch mit dem Kommando cgclassify einzelnen Gruppen zuweisen
- Prozess direkt in einer bestimmten Gruppe starten
Möchte der Admin einen Prozess direkt in einer bestimmten Gruppe starten, so verwendet er den Befehl cgexec :
cgexec -g blkio:dd "dd if=/dev/zero of=/tmp/test"
Aufruf
Optionen
| Unix | GNU | Parameter | Beschreibung |
|---|---|---|---|
Parameter
Umgebungsvariablen
Exit-Status
| Wert | Beschreibung |
|---|---|
| 0 | Erfolg |
| >0 | Fehler |
Anwendung
cgroup tree
sudo systemd-cgls
└ system
├ 1 /usr/lib/systemd/systemd --system --deserialize 18
├ ntpd.service
│ └ 8471 /usr/sbin/ntpd -u ntp:ntp -g
├ upower.service
│ └ 798 /usr/libexec/upowerd
├ wpa_supplicant.service
│ └ 751 /usr/sbin/wpa_supplicant -u -f /var/log/wpa_supplicant.log -c /etc/wpa_supplicant/wpa_supplicant.conf -u -f /var/log/wpa_supplicant.log -P /var/run/wpa_supplicant.pid
├ nfs-idmap.service
│ └ 731 /usr/sbin/rpc.idmapd
├ nfs-rquotad.service
│ └ 753 /usr/sbin/rpc.rquotad
├ nfs-mountd.service
│ └ 732 /usr/sbin/rpc.mountd
├ nfs-lock.service
│ └ 704 /sbin/rpc.statd
├ rpcbind.service
│ └ 680 /sbin/rpcbind -w
├ postfix.service
│ ├ 859 /usr/libexec/postfix/master
│ ├ 877 qmgr -l -t fifo -u
│ └ 32271 pickup -l -t fifo -u
├ colord-sane.service
│ └ 647 /usr/libexec/colord-sane
├ udisks2.service
│ └ 615 /usr/lib/udisks2/udisksd --no-debug
├ colord.service
│ └ 607 /usr/libexec/colord
├ prefdm.service
│ ├ 567 /usr/sbin/gdm-binary -nodaemon
│ ├ 602 /usr/libexec/gdm-simple-slave --display-id /org/gnome/DisplayManager/Display1
│ ├ 612 /usr/bin/Xorg :0 -br -verbose -auth /var/run/gdm/auth-for-gdm-O00GPA/database -seat seat0 -nolisten tcp
│ └ 905 gdm-session-worker [pam/gdm-password]
├ systemd-ask-password-wall.service
│ └ 645 /usr/bin/systemd-tty-ask-password-agent --wall
├ atd.service
│ └ 544 /usr/sbin/atd -f
├ ksmtuned.service
│ ├ 548 /bin/bash /usr/sbin/ksmtuned
│ └ 1092 sleep 60
├ dbus.service
│ ├ 586 /bin/dbus-daemon --system --address=systemd: --nofork --systemd-activation
│ ├ 601 /usr/libexec/polkit-1/polkitd --no-debug
│ └ 657 /usr/sbin/modem-manager
├ cups.service
│ └ 508 /usr/sbin/cupsd -f
├ avahi-daemon.service
│ ├ 506 avahi-daemon: running [epsilon.local]
│ └ 516 avahi-daemon: chroot helper
├ system-setup-keyboard.service
│ └ 504 /usr/bin/system-setup-keyboard
├ accounts-daemon.service
│ └ 502 /usr/libexec/accounts-daemon
├ systemd-logind.service
│ └ 498 /usr/lib/systemd/systemd-logind
├ crond.service
│ └ 486 /usr/sbin/crond -n
├ NetworkManager.service
│ ├ 484 /usr/sbin/NetworkManager --no-daemon
│ └ 8437 /sbin/dhclient -d -4 -sf /usr/libexec/nm-dhcp-client.action -pf /var/run/dhclient-wlan0.pid -lf /var/lib/dhclient/dhclient-903b6f6aa7a1-46c8-82a9-7f637dfbb3e4-wlan0.lease -cf /var/run/nm-d...
├ libvirtd.service
│ ├ 480 /usr/sbin/libvirtd
│ └ 571 /sbin/dnsmasq --strict-order --bind-interfaces --pid-file=/var/run/libvirt/network/default.pid --conf-file= --except-interface lo --listenaddress 192.168.122.1 --dhcp-range 192.168.122.2,1...
├ bluetooth.service
│ └ 479 /usr/sbin/bluetoothd -n
├ systemd-udev.service
│ └ 287 /usr/lib/systemd/systemd-udevd
└ systemd-journald.service
└ 280 /usr/lib/systemd/systemd-journald
ps with cgroups
alias psc='ps xawf -eo pid,user,cgroup,args
psc
PID USER CGROUP COMMAND
...
1 root name=systemd:/systemd-1 /bin/systemd systemd.log_target=kmsg systemd.log_level=debug selinux=0
415 root name=systemd:/systemd-1/sysinit.service /sbin/udevd -d
928 root name=systemd:/systemd-1/atd.service /usr/sbin/atd -f
930 root name=systemd:/systemd-1/ntpd.service /usr/sbin/ntpd -n
932 root name=systemd:/systemd-1/crond.service /usr/sbin/crond -n
935 root name=systemd:/systemd-1/auditd.service /sbin/auditd -n
943 root name=systemd:/systemd-1/auditd.service \_ /sbin/audispd
964 root name=systemd:/systemd-1/auditd.service \_ /usr/sbin/sedispatch
937 root name=systemd:/systemd-1/acpid.service /usr/sbin/acpid -f
941 rpc name=systemd:/systemd-1/rpcbind.service /sbin/rpcbind -f
944 root name=systemd:/systemd-1/rsyslog.service /sbin/rsyslogd -n -c 4
947 root name=systemd:/systemd-1/systemd-logger.service /lib/systemd/systemd-logger
950 root name=systemd:/systemd-1/cups.service /usr/sbin/cupsd -f
955 dbus name=systemd:/systemd-1/messagebus.service /bin/dbus-daemon --system --address=systemd: --nofork --systemd-activation
969 root name=systemd:/systemd-1/getty@.service/tty6 /sbin/mingetty tty6
970 root name=systemd:/systemd-1/getty@.service/tty5 /sbin/mingetty tty5
971 root name=systemd:/systemd-1/getty@.service/tty1 /sbin/mingetty tty1
973 root name=systemd:/systemd-1/getty@.service/tty4 /sbin/mingetty tty4
974 root name=systemd:/user/lennart/2 login -- lennart
1824 lennart name=systemd:/user/lennart/2 \_ -bash
975 root name=systemd:/systemd-1/getty@.service/tty3 /sbin/mingetty tty3
988 root name=systemd:/systemd-1/polkitd.service /usr/libexec/polkit-1/polkitd
994 rtkit name=systemd:/systemd-1/rtkit-daemon.service /usr/libexec/rtkit-daemon
...
Problembehebung
Konfiguration
Dateien
| Datei | Beschreibung |
|---|---|
Anhang
Siehe auch
Dokumentation
- Man-Page
Links
Projekt
Weblinks