Cgroups with systemd slices

Aus xinux.net
Zur Navigation springen Zur Suche springen

Prinzip

  • Standardmäßig erstellt systemd eine neue cgroup unter system.slice für jeden Dienst, den es überwacht.
  • Das ausführen von systemd-cgls zeigt die folgenden Dienste unter system.slice (die Ausgabe ist der Kürze halber abgeschnitten):
  • Sie können dieses Verhalten ändern, indem Sie die systemd-Dienstdatei bearbeiten.
  • Es gibt drei Optionen in Bezug auf die cgroup-Verwaltung mit systemd:
    • Bearbeiten der Servicedatei selbst.
    • Verwendung von Drop-in-Dateien.
    • Verwenden von systemctl set-property-Befehlen, die mit dem manuellen Bearbeiten der Dateien identisch sind, aber systemctl erstellt die erforderlichen Einträge für Sie.

Auf diese gehe ich weiter unten näher ein.

Servicedateien bearbeiten

  • Lassen Sie uns die Unit-Datei selbst bearbeiten.
  • Dazu habe ich eine sehr einfache Unit-Datei erstellt, die ein Skript ausführt:

Unit Datei

  • /etc/systemd/system/generate-load.service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/generate_load.sh
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Das Skript

  • cat /usr/local/bin/generate_load.sh
#!/bin/bash
/usr/bin/cat /dev/urandom > /dev/null &

Starten des Dienstes

  • systemcl start generate-load.service
  • systemd-cgls
Control group /:
...
└─system.slice 
  ├─prog.service 
  │ └─47462 netcat -lp 99 -s 127.0.0.1
  ├─systemd-udevd.service 
  │ └─212 /lib/systemd/systemd-udevd
  ├─cron.service 
  │ └─296 /usr/sbin/cron -f
  ├─systemd-journald.service 
  │ └─192 /lib/systemd/systemd-journald
  ├─ssh.service 
  │ └─410 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
  ├─rsyslog.service 
  │ └─303 /usr/sbin/rsyslogd -n -iNONE
  ├─generate-load.service 
  │ └─50387 /usr/bin/cat /dev/urandom
... 

Eigener Slice

  • Was passiert, wenn ich der systemd-Dienstdatei die folgende Zeile hinzufüge?
Slice=my-beautiful.slice
  • Die Ausgabe von systemd-cgls zeigt etwas Merkwürdiges. Der generate-load.service ist nun tief verschachtelt:
  • systemd-cgls
Control group /:
-.slice
├─my.slice 
│ └─my-beautiful.slice 
│   └─my-beautiful.slice 
│     └─generate-load.service 
│       └─53737 /usr/bin/cat /dev/urandom
  • Warum ist das? Die Antwort hat damit zu tun, wie systemd verschachtelte cgroups interpretiert.
  • Kinder werden folgendermaßen deklariert: -.slice. Da systemd versucht, hilfreich zu sein, wenn ein übergeordnetes Element nicht existiert, erstellt systemd es für Sie.
  • Wenn ich Unterstriche _ anstelle von Bindestrichen verwendet hätte, wäre das Ergebnis so gewesen, wie Sie es erwartet hätten:

Verwendung von Drop-in-Dateien

  • Drop-in-Dateien für systemd sind ziemlich einfach einzurichten.
  • Erstellen Sie zunächst ein geeignetes Verzeichnis basierend auf dem Namen Ihres Dienstes in /etc/systemd/system.
  • Führen Sie im cat-Beispiel den folgenden Befehl aus:
  • mkdir -p /etc/systemd/system/generate-load.service.d/
  • Diese Dateien können beliebig organisiert werden.
  • Sie werden basierend auf der numerischen Reihenfolge ausgeführt, daher sollten Sie Ihre Konfigurationsdateien etwa 10-CPUSettings.conf benennen.
  • Alle Dateien in diesem Verzeichnis sollten die Dateierweiterung .conf haben und erfordern, dass Sie jedes Mal, wenn Sie eine dieser Dateien anpassen, systemctl daemon-reload ausführen.
  • Ich habe zwei Drop-In-Dateien erstellt, um zu zeigen, wie Sie verschiedene Konfigurationen aufteilen können.
  • Die erste ist 00-slice.conf. Wie unten zu sehen ist, richtet es die Standardoptionen für ein separates Slice für den cat-Dienst ein:
[Service]
Slice=AWESOME.slice
MemoryAccounting=yes
CPUAccounting=yes

Die andere Datei legt die Anzahl der CPUShares fest und heißt 10-CPUSettings.conf.

[Service]
CPUShares=256

Um zu zeigen, dass diese Methode funktioniert, erstelle ich einen zweiten Dienst im selben Slice. Um die Prozesse besser voneinander unterscheiden zu können, ist das zweite Skript etwas anders:

!/bin/bash
/usr/bin/sha256sum /dev/urandom > /dev/null & 

Ich habe dann einfach Kopien der cat-Dateien erstellt, das Skript ersetzt und den CPUShares-Wert geändert:

  • sed 's/load\.sh/load2\.sh/g' cat.service > sha256sum.service
  • cp -r cat.service.d sha256sum.service.d
  • sed -i 's/256/2048/g' sha256sum.service.d/10-CPUSettings.conf

Laden Sie abschließend den Daemon neu und starten Sie die Dienste:

  • systemctl daemon-reload
  • systemctl startet cat.service
  • systemctl startet sha256sum.service

Anstatt Ihnen die Ausgabe von top zu zeigen, ist jetzt ein guter Zeitpunkt, um Ihnen systemd-cgtop vorzustellen. Es funktioniert ähnlich wie das normale Top, außer dass es Ihnen eine Aufschlüsselung pro Slice und dann wieder nach Diensten in jedem Slice gibt. Dies ist sehr hilfreich, um festzustellen, ob Sie cgroups im Allgemeinen auf Ihrem System gut nutzen. Wie unten zu sehen ist, zeigt systemd-cgtop sowohl die Aggregation für alle Dienste in einem bestimmten Slice als Teil des Gesamtsystems als auch die Ressourcennutzung jedes Dienstes in einem Slice:

Nutzen von systemctl set-property

Die letzte Methode, die zum Konfigurieren von cgroups verwendet werden kann, ist der Befehl systemctl set-property. Ich beginne mit einer grundlegenden Dienstdatei md5sum.service:

[Service]
Type=oneshot
ExecStart=/root/generate_load3.sh
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
Slice=AWESOME.slice
[Install]
WantedBy=multi-user.target

Mit dem Befehl systemctl set-property werden die Dateien in

/etc/systemd/system.control

abgelegt. Diese Dateien dürfen nicht von Hand bearbeitet werden. Nicht jede Eigenschaft wird vom set-property-Befehl erkannt, daher wurde die Slice-Definition in die Dienstdatei selbst eingefügt.

Nachdem ich die Unit-Datei eingerichtet und den Daemon neu geladen habe, verwende ich den systemctl-Befehl ähnlich dem folgenden:

  • systemctl set-property md5sum.service CPUShares=1024

Dadurch wird eine Drop-In-Datei für Sie erstellt, die sich unter

/etc/systemd/system.control/md5sum.service.d/50-CPUShares.conf

befindet. Schauen Sie sich die Dateien gerne an, wenn Sie neugierig auf deren Inhalt sind. Da diese Dateien nicht dazu gedacht sind, von Hand bearbeitet zu werden, werde ich keine Zeit damit verbringen.

Sie können testen, ob die Änderungen wirksam wurden, indem Sie Folgendes ausführen:

  • systemctl start md5sum.service cat.service sha256sum.service

Wie Sie im Screenshot unten sehen, scheinen die Änderungen erfolgreich zu sein. sha256sum.service ist für 2048 CPUShares konfiguriert, während md5sum.service 1024 hat. Schließlich hat cat.service 256.

Quellen

Links