Ressourcen mit Kontrollgruppen verwalten
Erläutert, wie Kontrollgruppen Prozesse organisieren, wie systemd Ressourcen-Policys anwendet und wann cgroups manuell verwaltet werden.
Kontrollgruppen, die als cgroups bezeichnet werden, sind ein Oracle Linux-Kernelfeature, das systemd-Services und bei Bedarf einzelne Prozesse (PIDs) in hierarchischen Gruppen für die Zuweisung von Systemressourcen wie CPU, Arbeitsspeicher und I/O organisiert.
Beispiel: Wenn Sie drei Prozesse identifiziert haben, denen CPU-Zeit im Verhältnis 150:100:50 zugewiesen werden muss, können Sie drei cgroups erstellen, die jeweils eine CPU-Gewichtung aufweisen, die einem der drei Werte im Verhältnis entspricht, und jedem cgroup den entsprechenden Prozess zuweisen.
Konfigurieren Sie cgroups mit systemd.
Die manuelle Erstellung von cgroup-Verzeichnissen im virtuellen Dateisystem /sys/fs/cgroup (wie in diesem Thema erläutert) kann hilfreich sein, um die zugrunde liegenden Konzepte zu veranschaulichen. Verwenden Sie diesen Ansatz jedoch für bestimmte Szenarien, wie temporäres Debugging oder Testen. Verwenden Sie für die meisten Anwendungsfälle systemd, um cgroups zu konfigurieren, um eine korrekte und persistente Ressourcenverwaltung sicherzustellen.
Standardmäßig erstellt systemd eine cgroup für Folgendes:
-
Jeder
systemd-Service wird auf dem Host eingerichtet.Beispiel: Ein Server kann die Kontrollgruppe
NetworkManager.serviceaufweisen, um Prozesse zu gruppieren, die dem ServiceNetworkManagergehören, und die Kontrollgruppefirewalld.service, um Prozesse zu gruppieren, die dem Servicefirewalldgehören, usw. -
Jeder Benutzer (
UID) auf dem Host.
Die Funktion cgroup wird als virtuelles Dateisystem unter /sys/fs/cgroup gemountet. Jede cgroup verfügt über ein entsprechendes Verzeichnis im Dateisystem /sys/fs/cgroup. Beispiel: Die cgroups, die von systemd für die verwalteten Services erstellt wurde, kann durch Ausführen des Befehls ls -l /sys/fs/cgroup/system.slice | grep ".service" angezeigt werden, wie im folgenden Beispielcodeblock dargestellt:
ls -l /sys/fs/cgroup/system.slice | grep ".service"
...root root 0 Mar 22 10:47 atd.service
...root root 0 Mar 22 10:47 auditd.service
...root root 0 Mar 22 10:47 chronyd.service
...root root 0 Mar 22 10:47 crond.service
...root root 0 Mar 22 10:47 dbus-broker.service
...root root 0 Mar 22 10:47 dtprobed.service
...root root 0 Mar 22 10:47 firewalld.service
...root root 0 Mar 22 10:47 httpd.service
...
Sie können auch benutzerdefinierte cgroups erstellen, indem Sie Verzeichnisse unter dem virtuellen Dateisystem /sys/fs/cgroup erstellen und Prozess-IDs (PIDs) je nach Systemanforderungen verschiedenen cgroups zuweisen. Es wird jedoch empfohlen, systemd zu verwenden, um cgroups zu konfigurieren, anstatt cgroups manuell unter /sys/fs/cgroup. zu erstellen.
Die empfohlene Methode zur Verwaltung von cgroups bis systemd finden Sie unter Systemd zum Verwalten von Kontrollgruppen verwenden.
Im Linux-Kernel sind zwei Versionen von Kontrollgruppen verfügbar.
- Kontrollgruppen Version 1 (
cgroups v1) -
Stellt eine Controllerhierarchie pro Ressource bereit. Jede Ressource (CPU, Arbeitsspeicher, I/O usw.) verfügt über einen eigenen Kontrollgruppenbaum. Dies kann die Koordination zwischen den Ressourcen erschweren. Verwendet eine Legacy-API. Wird jetzt als veraltet betrachtet, ist jedoch aus Gründen der Kompatibilität auf unterstützten Systemen verfügbar.
- Kontrollgruppen Version 2 (
cgroups v2) -
Verwendet eine einheitliche, einzige Hierarchie für alle Controller, die eine verbesserte Koordination zwischen den Ressourcen und eine einfachere Verwaltung ermöglicht. Verwendet eine moderne, vereinfachte API. Dies ist die bevorzugte und aktiv entwickelte Implementierung.
In der folgenden Tabelle wird die Verfügbarkeit pro Oracle Linux-Release zusammengefasst:
| Oracle Linux-Version | cgroups v1 | cgroups v2 |
|---|---|---|
| Oracle Linux 8 | Verfügbar (Standard) | Verfügbar (manuell aktivieren) |
| Oracle Linux 9 | Verfügbar (Kompatibilität) | Verfügbar (Standard) |
| Oracle Linux 10 | Nicht verfügbar (veraltet) | Verfügbar (Standard) |
Weitere Hintergrundinformationen zu Kontrollgruppen finden Sie in den manuellen Seiten cgroups(7) und sysfs(5).
cgroups v2 auf Oracle Linux 8 aktivieren
cgroups v2 auf Oracle Linux 9 und Oracle Linux 10 überprüfen
sudo mount -l | grep cgroup
cgroup2 on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime,seclabel,nsdelegate,memory_recursiveprot)
Kernel-Ressourcencontroller
Kontrollgruppen verwalten die Ressourcenverwendung über Kernel-Resource-Controller. Ein Kernel-Ressourcencontroller stellt eine einzelne Ressource dar, wie CPU-Zeit, Arbeitsspeicher, Netzwerkbandbreite oder Datenträger-I/O.
Um gemountete Ressourcencontroller im System zu identifizieren, prüfen Sie den Inhalt der Datei /procs/cgroups. Beispiel:
less /proc/cgroups
#subsys_name hierarchy num_cgroups enabled
cpuset 0 103 1
cpu 0 103 1
cpuacct 0 103 1
blkio 0 103 1
memory 0 103 1
devices 0 103 1
freezer 0 103 1
net_cls 0 103 1
perf_event 0 103 1
net_prio 0 103 1
hugetlb 0 103 1
pids 0 103 1
rdma 0 103 1
misc 0 103 1
Eine detaillierte Erläuterung der Kernel-Ressourcencontroller von cgroups finden Sie in der cgroups(7)-Manpage.
Informationen zum Kontrollgruppen-Dateisystem
Die cgroup-Funktionalität wird als hierarchisches Dateisystem in /sys/fs/cgroup gemountet.
Das Verzeichnis /sys/fs/cgroup wird auch als Root-Kontrollgruppe bezeichnet.
Der Inhalt des Verzeichnisses der Root-Kontrollgruppe variiert je nach eingehängter Version geringfügig. Bei Systemen, die cgroups v2 verwenden, werden in der Regel Einträge wie die folgenden angezeigt:
ls /sys/fs/cgroup
cgroup.controllers cpuset.mems.effective memory.stat
cgroup.max.depth cpu.stat misc.capacity
cgroup.max.descendants dev-hugepages.mount sys-fs-fuse-connections.mount
cgroup.procs dev-mqueue.mount sys-kernel-config.mount
cgroup.stat init.scope sys-kernel-debug.mount
cgroup.subtree_control io.pressure sys-kernel-tracing.mount
cgroup.threads io.stat system.slice
cpu.pressure memory.numa_stat user.slice
cpuset.cpus.effective memory.pressure
mkdir können Sie cgroup-Unterverzeichnisse innerhalb der Root-Kontrollgruppe erstellen. Sie können beispielsweise die folgenden cgroup-Unterverzeichnisse erstellen:/sys/fs/cgroup/MyGroups//sys/fs/cgroup/MyGroups/cgroup1/sys/fs/cgroup/MyGroups/cgroup2
Die Best-Design-Praxis ist, dass die untergeordnete
cgroups mindestens 2 Ebenen tief in der /sys/fs/cgroup ist. Die Beispiele in der vorherigen Liste folgen dieser Übung, indem die erste untergeordnete Gruppe, MyGroups, als übergeordnetes Element verwendet wird, das die unterschiedliche cgroups enthält, die für das System benötigt wird. Jede cgroup in der Hierarchie enthält die folgenden Dateien:
-
cgroup.controllers -
Diese schreibgeschützte Datei listet die Controller auf, die im aktuellen
cgroupverfügbar sind. Der Inhalt dieser Datei entspricht dem Inhalt der Dateicgroup.subtree_controlim übergeordneten Verzeichniscgroup. -
cgroup.subtree_control -
Diese Datei enthält die Controller in der Datei
cgroup.controllers, die für die unmittelbare untergeordnete Dateicgroupsdes aktuellencgroupaktiviert sind.Wenn ein Controller (z.B.
pids) in der Dateicgroup.subtree_controlvorhanden ist, werden die entsprechenden Controller-Schnittstellendateien (z.B.pids.max) automatisch in den unmittelbar untergeordneten Dateien des aktuellencgrouperstellt.
Eine Beispielprozedur, die untergeordnete Gruppen erstellt, in denen Sie die RessourcenAdministration für eine Anwendung implementieren können, finden Sie unter CPU-Gewichtung festlegen, um die Verteilung der CPU-Zeit zu regulieren.
Um eine cgroup zu entfernen, stellen Sie sicher, dass die cgroup keine anderen untergeordneten Gruppen enthält, und entfernen Sie dann das Verzeichnis. Beispiel: Um die untergeordnete Gruppe /sys/fs/cgroup/MyGroups/cgroup1 zu entfernen, können Sie den folgenden Befehl ausführen:
sudo rmdir /sys/fs/cgroup/MyGroups/cgroup1
Ressourcenverteilungsmodelle
Die folgenden Distributionsmodelle bieten Möglichkeiten zur Implementierung von Kontrolle oder Regulierung bei der Verteilung von Ressourcen für die Verwendung durch cgroups v2:
- Gewichtungen
-
In diesem Modell werden die Gewichtungen aller Kontrollgruppen summiert. Jede Gruppe erhält einen Bruchteil der Ressource basierend auf dem Verhältnis der Gruppengewichtung zum Gesamtgewicht.
Betrachten Sie 10 Kontrollgruppen mit jeweils einem Gewicht von 100 für eine kombinierte Summe von 1000. In diesem Fall kann jede Gruppe ein Zehntel einer angegebenen Ressource verwenden.
Das Gewicht wird normalerweise verwendet, um zustandslose Ressourcen zu verteilen. Um diese Ressource anzuwenden, wird die Option
CPUWeightverwendet. - Limits
-
In diesem Modell kann eine Gruppe bis zu der konfigurierten Menge einer Ressource verwenden. Wenn eine Ressource wie die Speichernutzung für einen Prozess den Grenzwert überschreitet, kann der Kernel den Prozess mit einer Out-of-Memory-(oom-)Nachricht stoppen.
Sie können Ressourcen auch überfestschreiben, sodass die Summe der Untergruppengrenzwerte das Limit der übergeordneten Gruppe überschreiten kann. Bei einer Überverpflichtung wird davon ausgegangen, dass Ressourcen in allen Untergruppen nicht alle gleichzeitig an ihre Grenzen stoßen.
Zur Implementierung dieses Verteilungsmodells wird häufig die Option
MemoryMaxverwendet. - Schutz
-
In diesem Modell wird einer Gruppe eine geschützte Begrenzung zugewiesen. Wenn die Ressourcennutzung der Gruppe innerhalb des geschützten Betrags bleibt, kann der Kernel der Gruppe die Verwendung der Ressource nicht zugunsten anderer Gruppen entziehen, die um dieselbe Ressource konkurrieren. In diesem Modell ist eine Überzuordnung von Ressourcen zulässig.
Zur Implementierung dieses Modells wird häufig die Option
MemoryLowverwendet. - Umlagen
-
In diesem Modell wird ein bestimmter absoluter Betrag für die Verwendung endlicher Ressourcen zugewiesen, wie z.B. Echtzeitbudget.
cgroups v2 mit sysfs verwalten
Zeigt, wie Sie cgroups v2-Hierarchien direkt in /sys/fs/cgroup zur Fehlerbehebung oder für temporäre Tests erstellen und optimieren.
Verwenden Sie systemd, um die gesamte RessourcenAdministration nach Möglichkeit zu verwalten. Weitere Informationen finden Sie unter Systemd zum Verwalten von Kontrollgruppen verwenden.
Die hier vorgestellten Beispiele enthalten den Kontext für Aktionen, die systemd auf einem System ausführt, und zeigen die Funktionalität außerhalb von systemd an. Die bereitgestellten Informationen können beim Debuggen von Problemen mit cgroups hilfreich sein.
Im Beispielverfahren wird die CPU-Zeit zwischen cgroups zugewiesen, denen jeweils unterschiedliche Anwendungs-PIDs zugewiesen sind. Die Werte für CPU-Zeit und Anwendungs-PID werden in den Dateien cpu.weight und cgroup.procs jeder Gruppe festgelegt.
Das Beispiel enthält auch die erforderlichen Schritte, um sicherzustellen, dass der cpu-Controller und die zugehörigen Dateien, einschließlich der Datei cpu.weight, in der Datei cgroups verfügbar sind, die Sie unter /sys/fs/cgroup erstellen müssen.
Kontrollgruppe für die Verteilung der CPU-Zeit vorbereiten
In diesem Verfahren wird beschrieben, wie Sie eine Kontrollgruppe manuell vorbereiten, um die Verteilung der CPU-Zeit zu verwalten. Beachten Sie, dass die empfohlene Vorgehensweise zum Konfigurieren von Kontrollgruppen die Verwendung von systemd ist.
CPU-Gewicht einstellen, um die Verteilung der CPU-Zeit zu regulieren
In diesem Verfahren wird beschrieben, wie Sie die CPU-Gewichtung für drei verschiedene Prozesse festlegen, indem Sie eine Kontrollgruppe zur Verwaltung der Verteilung der CPU-Zeit verwenden. Beachten Sie, dass die empfohlene Vorgehensweise zum Konfigurieren von Kontrollgruppen die Verwendung von systemd ist.
Dieses Verfahren basiert auf den folgenden Annahmen:
-
Die Anwendung, die CPU-Ressourcen übermäßig verbraucht, ist
sha1sum, wie in der folgenden Beispielausgabe des Befehlstopdargestellt:sudo top... PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 33301 root 20 0 18720 1756 1468 R 99.0 0.0 0:31.09 sha1sum 33302 root 20 0 18720 1772 1480 R 99.0 0.0 0:30.54 sha1sum 33303 root 20 0 18720 1772 1480 R 99.0 0.0 0:30.54 sha1sum 1 root 20 0 109724 17196 11032 S 0.0 0.1 0:03.28 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_gp 4 root 0 -20 0 0 0 I 0.0 0.0 0:00.00 rcu_par_gp ... -
Die
sha1sum-Prozesse haben die PIDs 33301, 33302 und 33303, wie in der vorherigen Beispielausgabe aufgeführt.
Als Voraussetzung für das folgende Verfahren müssen Sie die Vorbereitungen für cgroup-v2 abschließen, wie unter Kontrollgruppe für die Verteilung der CPU-Zeit vorbereiten beschrieben. Wenn Sie diese Vorbereitungen übersprungen haben, können Sie diesen Vorgang nicht abschließen.