In diesem letzten Teil meiner vierteiligen Cgroup-Artikelserie behandle ich die Cgroup-Integration mit systemd. Sehen Sie sich auf jeden Fall auch die Teile eins, zwei und drei der Serie an.
Cgroups mit systemd
Standardmäßig erstellt systemd eine neue Kontrollgruppe unter system.slice
für jeden überwachten Dienst. Gehen wir zurück zu unserem OpenShift Control Plane-Host und führen Sie systemd-cgls
aus zeigt die folgenden Dienste unter system.slice
(Ausgabe wird der Kürze halber abgeschnitten):
└─system.slice
├─sssd.service
├─lvm2-lvmetad.service
├─rsyslog.service
├─systemd-udevd.service
├─systemd-logind.service
├─systemd-journald.service
├─crond.service
├─origin-node.service
├─docker.service
├─dnsmasq.service
├─tuned.service
├─sshd.service
├─NetworkManager.service
├─dbus.service
├─polkit.service
├─chronyd.service
├─auditd.service
└─[email protected]
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 Dienstdatei selbst.
- Drop-in-Dateien verwenden.
- Mit
systemctl set-property
Befehle, die mit der manuellen Bearbeitung der Dateien identisch sind, abersystemctl
erstellt die erforderlichen Einträge für Sie.
Ich gehe weiter unten näher darauf ein.
Dienstdateien bearbeiten
Lassen Sie uns die Unit-Datei selbst bearbeiten. Dazu habe ich eine sehr einfache Unit-Datei erstellt, die ein Skript ausführt:
[Service]
Type=oneshot
ExecStart=/root/generate_load.sh
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
Das Bash-Skript hat nur zwei Zeilen:
#!/bin/bash
/usr/bin/cat /dev/urandom > /dev/null &
Wenn Sie die Ausgabe von systemd-cgls
untersuchen , sehen Sie, dass unser neuer Dienst unter system.slice
verschachtelt ist (Ausgabe abgeschnitten):
└─system.slice
├─cat.service
├─tuned.service
├─sshd.service
├─NetworkManager.service
├─sssd.service
├─dbus.service
│ └─[email protected]
└─systemd-logind.service
Was passiert, wenn ich der systemd-Dienstdatei die folgende Zeile hinzufüge?
Slice=my-beautiful-slice.slice
Die Ausgabe von systemd-cgls
zeigt etwas Kurioses. Der cat.service
Datei ist jetzt tief verschachtelt:
Control group /:
├─my.slice
│ └─my-beautiful.slice
│ └─my-beautiful-slice.slice
│ └─cat.service
│ └─4010 /usr/bin/cat /dev/urandom
Warum ist das? Die Antwort hat damit zu tun, wie systemd verschachtelte cgroups interpretiert. Kinder werden folgendermaßen deklariert:
. Da systemd versucht, hilfreich zu sein, wenn ein übergeordnetes Element nicht existiert, erstellt systemd es für Sie. Wenn ich Unterstriche _
verwendet hätte statt Bindestriche -
das Ergebnis wäre das gewesen, was Sie erwartet hätten:
Control group /:
├─my_beautiful_slice.slice
│ └─cat.service
│ └─4123 /usr/bin/cat /dev/urandom
Drop-in-Dateien verwenden
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
. In der cat
Führen Sie beispielsweise den folgenden Befehl aus:
# mkdir -p /etc/systemd/system/cat.service.d/
Diese Dateien können beliebig organisiert werden. Sie werden basierend auf der numerischen Reihenfolge ausgeführt, daher sollten Sie Ihre Konfigurationsdateien etwa so benennen wie 10-CPUSettings.conf
. Alle Dateien in diesem Verzeichnis sollten die Dateiendung .conf
haben und verlangen, dass Sie systemctl daemon-reload
ausführen jedes Mal, wenn Sie eine dieser Dateien anpassen.
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 cat
ein Dienst:
[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
erstellt Dateien, Ersetzen des Skripts und Ändern des CPUShares-Werts:
# 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 start cat.service
# systemctl start sha256sum.service
[ Den Lesern gefiel auch:Was passiert hinter den Kulissen eines wurzellosen Podman-Containers? ]
Anstatt Ihnen die Ausgabe von top
zu zeigen , jetzt ist ein guter Zeitpunkt, um Ihnen systemd-cgtop
vorzustellen . Es funktioniert ähnlich wie das normale top
außer es gibt Ihnen eine Aufschlüsselung pro Slice und dann wieder nach Diensten in jedem Slice. Dies ist sehr hilfreich, um festzustellen, ob Sie cgroups im Allgemeinen auf Ihrem System gut nutzen. Wie unten zu sehen, systemd-cgtop
zeigt sowohl die Aggregation für alle Dienste in einem bestimmten Slice als Teil des Gesamtsystems als auch die Ressourcennutzung jedes Dienstes in einem Slice:
Verwenden von systemctl set-property
Die letzte Methode, die zum Konfigurieren von cgroups verwendet werden kann, ist systemctl set-property
Befehl. Ich beginne mit einer einfachen 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
Verwenden der systemctl set-property
Der Befehl legt die Dateien in /etc/systemd/system.control
ab . Diese Dateien dürfen nicht von Hand bearbeitet werden. Nicht jede Eigenschaft wird von set-property
erkannt Befehl, also das Slice
Definition wurde in die Dienstdatei selbst eingefügt.
Nachdem ich die Unit-Datei eingerichtet und den Daemon neu geladen habe, verwende ich das 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
hat 1024. Schließlich cat.service
hat 256.
[ Denken Sie an Sicherheit? Lesen Sie diesen kostenlosen Leitfaden zur Verbesserung der Hybrid Cloud-Sicherheit und zum Schutz Ihres Unternehmens. ]
Abschluss
Hoffentlich haben Sie während unserer gemeinsamen Reise etwas Neues gelernt. Es gab viel zu bewältigen, und wir haben kaum an der Oberfläche gekratzt, was mit cgroups möglich ist. Abgesehen von der Rolle, die Cgroups dabei spielen, Ihr System gesund zu halten, spielen sie auch eine Rolle in einer „Defense-in-Depth“-Strategie. Darüber hinaus sind cgroups eine entscheidende Komponente für moderne Kubernetes-Workloads, wo sie den ordnungsgemäßen Ablauf von containerisierten Prozessen unterstützen. Cgroups sind für so viele Dinge verantwortlich, einschließlich:
- Beschränkung der Ressourcen von Prozessen.
- Prioritäten festlegen, wenn Konflikte auftreten.
- Steuerung des Zugriffs auf Lese-/Schreib- und mknod-Geräte.
- Bereitstellung eines hohen Abrechnungsniveaus für Prozesse, die auf einem System ausgeführt werden.
Man könnte argumentieren, dass Containerisierung, Kubernetes und eine Vielzahl anderer geschäftskritischer Implementierungen ohne die Nutzung von Cgroups nicht möglich wären.
Wenn Sie Fragen oder Kommentare oder vielleicht andere Artikelideen haben, können Sie mich gerne auf Twitter kontaktieren. Ich freue mich auf Ihr Feedback.
Quellen
https://0xax.gitbooks.io/linux-insides/content/Cgroups/linux-cgroups-1.html
https://sysadmincasts.com/episodes/14-introduction-to-linux-control-groups -cgroups
https://itnext.io/chroot-cgroups-and-namespaces-an-overview-37124d995e3d
https://www.certdepot.net/rhel7-get-started-cgroups/
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/resource_management_guide/chap-introduction_to_control_groups
https://oakbytes.wordpress.com/2012/09/02/ cgroup-cpu-allocation-cpu-shares-examples/
https://www.redhat.com/en/blog/world-domination-cgroups-part-1-cgroup-basics
https:/ /www.redhat.com/en/blog/world-domination-cgroups-rhel-8-welcome-cgroups-v2
https://youtu.be/z7mgaWqiV90
https://youtu.be /el7768BNUPw
https://youtu.be/sK5i-N34im8
https://youtu.be/_AODvcO5Q_8
https://youtu.be/x1npPrzyKfs
https:/ /youtu.be/yZpNsDe4Qzg
https://access.redhat.com/solutions/4489171