Zum Inhalt springen

Cgroups

Aus Foxwiki

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
  1. cgroups(7)


Links

Projekt

Weblinks