GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Verwalten von cgroups mit systemd

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, aber systemctl 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:-.slice . 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


Linux
  1. So erstellen Sie einen Systemd-Dienst unter Linux

  2. Linux – Wie bekommt man mit Systemd weniger Ttys?

  3. Stoppen der Systemd-Einheit zusammen mit einer anderen. Beginn der Arbeiten?

  4. systemd - Gibt meinem Dienst mehrere Argumente

  5. Wie bekomme ich mit Systemd weniger ttys?

So führen Sie Jenkins Container als Systemd-Dienst mit Docker aus

So führen Sie Container als Systemd-Dienst mit Podman aus

So verwalten Sie Systemd-Dienste mit Systemctl unter Linux

Systemctl-Befehle zum Verwalten des Systemd-Dienstes

Jenkins mit Systemd und Docker installieren und ausführen

Erste Schritte mit systemctl