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.

Wichtig

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.service aufweisen, um Prozesse zu gruppieren, die dem Service NetworkManager gehören, und die Kontrollgruppe firewalld.service, um Prozesse zu gruppieren, die dem Service firewalld gehö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:

Versionsunterstützung für cgroups nach Oracle Linux-Release
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

  1. Prüfen Sie die aktuellen Einhängevorgänge.
    sudo mount -l | grep cgroup

    Wenn in der Ausgabe bereits cgroup2 in /sys/fs/cgroup angezeigt wird, ist keine weitere Aktion erforderlich.

  2. Fügen Sie den Boot-Parameter für die einheitliche Hierarchie hinzu.
    sudo grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=1"

    Der Befehl hängt systemd.unified_cgroup_hierarchy=1 an jeden Kernel-Eintrag an, sodass Version 2 beim Booten eingehängt wird.

  3. Starten Sie neu, um die Änderung anzuwenden.
  4. Prüfen Sie, ob cgroups v2 gemountet ist.
    sudo mount -l | grep cgroup

    Suchen Sie in der Ausgabe nach cgroup2 on /sys/fs/cgroup.

cgroups v2 auf Oracle Linux 9 und Oracle Linux 10 überprüfen

Prüfen Sie den Einhängepunkt.
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
Mit dem Befehl 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

Hinweis

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 cgroup verfügbar sind. Der Inhalt dieser Datei entspricht dem Inhalt der Datei cgroup.subtree_control im übergeordneten Verzeichnis cgroup.

cgroup.subtree_control

Diese Datei enthält die Controller in der Datei cgroup.controllers, die für die unmittelbare untergeordnete Datei cgroups des aktuellen cgroup aktiviert sind.

Wenn ein Controller (z.B. pids) in der Datei cgroup.subtree_control vorhanden ist, werden die entsprechenden Controller-Schnittstellendateien (z.B. pids.max) automatisch in den unmittelbar untergeordneten Dateien des aktuellen cgroup erstellt.

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 CPUWeight verwendet.

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 MemoryMax verwendet.

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 MemoryLow verwendet.

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.

Wichtig

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.

  1. Prüfen Sie, ob der Controller cpu oben in der Hierarchie in der Root-Kontrollgruppe verfügbar ist.

    Den Inhalt der Datei /sys/fs/cgroup/cgroup.controllers auf dem Bildschirm drucken:

    sudo cat /sys/fs/cgroup/cgroup.controllers
    cpuset cpu io memory hugetlb pids rdma misc

    Sie können alle Controller, die in der Datei cgroup.controllers aufgeführt sind, zur Datei cgroup.subtree_control im selben Verzeichnis hinzufügen, um sie für das unmittelbar untergeordnete Verzeichnis cgroups der Gruppe verfügbar zu machen.

  2. Fügen Sie den Controller cpu zur Datei cgroup.subtree_control hinzu, um ihn für die unmittelbar untergeordnete Datei cgroups der Root verfügbar zu machen.

    Standardmäßig sind nur die Controller memory und pids in der Datei enthalten. Um den Controller cpu hinzuzufügen, geben Sie Folgendes ein:

    echo "+cpu" | sudo tee /sys/fs/cgroup/cgroup.subtree_control
    
  3. Prüfen Sie optional, ob der Controller cpu wie erwartet hinzugefügt wurde.
    sudo cat /sys/fs/cgroup/cgroup.subtree_control
    cpu memory pids
  4. Erstellen Sie eine untergeordnete Gruppe unter der Root-Kontrollgruppe, um die neue Kontrollgruppe für die Verwaltung von CPU-Ressourcen in Anwendungen zu werden.
    sudo mkdir /sys/fs/cgroup/MyGroups
  5. Listen Sie optional den Inhalt des neuen Unterverzeichnisses oder der untergeordneten Gruppe auf, und bestätigen Sie, dass der cpu-Controller wie erwartet vorhanden ist.
    ls -l /sys/fs/cgroup/MyGroups
    -r—​r—​r--. 1 root root 0 Jun  1 10:33 cgroup.controllers
    -r—​r—​r--. 1 root root 0 Jun  1 10:33 cgroup.events
    -rw-r—​r--. 1 root root 0 Jun  1 10:33 cgroup.freeze
    -rw-r—​r--. 1 root root 0 Jun  1 10:33 cgroup.max.depth
    -rw-r—​r--. 1 root root 0 Jun  1 10:33 cgroup.max.descendants
    -rw-r—​r--. 1 root root 0 Jun  1 10:33 cgroup.procs
    -r—​r—​r--. 1 root root 0 Jun  1 10:33 cgroup.stat
    -rw-r—​r--. 1 root root 0 Jun  1 10:33 cgroup.subtree_control
    …​
    -r—​r—​r--. 1 root root 0 Jun  1 10:33 cpu.stat
    -rw-r—​r--. 1 root root 0 Jun  1 10:33 cpu.weight
    -rw-r—​r--. 1 root root 0 Jun  1 10:33 cpu.weight.nice
    …​
    -r—​r—​r--. 1 root root 0 Jun  1 10:33 memory.events.local
    -rw-r—​r--. 1 root root 0 Jun  1 10:33 memory.high
    -rw-r—​r--. 1 root root 0 Jun  1 10:33 memory.low
    …​
    -r—​r—​r--. 1 root root 0 Jun  1 10:33 pids.current
    -r—​r—​r--. 1 root root 0 Jun  1 10:33 pids.events
    -rw-r—​r--. 1 root root 0 Jun  1 10:33 pids.max
  6. Aktivieren Sie den Controller cpu in der Datei cgroup.subtree_control im Verzeichnis MyGroups, um ihn für die unmittelbar untergeordnete Datei cgroups verfügbar zu machen.
    echo "+cpu" | sudo tee /sys/fs/cgroup/MyGroups/cgroup.subtree_control
  7. Prüfen Sie optional, ob der Controller cpu für untergeordnete Gruppen unter MyGroups aktiviert ist.
    sudo cat /sys/fs/cgroup/MyGroups/cgroup.subtree_control
    cpu

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 Befehls top dargestellt:

    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.

Wichtig

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.

  1. Erstellen Sie 3 untergeordnete Gruppen im Unterverzeichnis MyGroups.
    sudo mkdir /sys/fs/cgroup/MyGroups/g1
    sudo mkdir /sys/fs/cgroup/MyGroups/g2
    sudo mkdir /sys/fs/cgroup/MyGroups/g3
  2. Konfigurieren Sie die CPU-Gewichtung für jede untergeordnete Gruppe.
    echo "150" | sudo tee /sys/fs/cgroup/MyGroups/g1/cpu.weight
    echo "100" | sudo tee /sys/fs/cgroup/MyGroups/g2/cpu.weight
    echo "50" | sudo tee /sys/fs/cgroup/MyGroups/g3/cpu.weight
  3. Wenden Sie die Anwendungs-PIDs auf die entsprechenden Kindgruppen an.
    echo "33301" | sudo tee /sys/fs/cgroup/MyGroups/g1/cgroup.procs
    echo "33302" | sudo tee /sys/fs/cgroup/MyGroups/g2/cgroup.procs
    echo "33303" | sudo /sys/fs/cgroup/MyGroups/g3/cgroup.procs

    Diese Befehle legen fest, dass die ausgewählten Anwendungen Mitglieder der Kontrollgruppen MyGroups/g*/ werden. Die CPU-Zeit für jeden sha1sum-Prozess hängt von der CPU-Zeitverteilung ab, die für jede Gruppe konfiguriert ist.

    Die Gewichtungen der Gruppen g1, g2 und g3, die Prozesse ausgeführt haben, werden auf der Ebene MyGroups zusammengefasst, der übergeordneten Kontrollgruppe.

    Wenn bei dieser Konfiguration alle Prozesse gleichzeitig ausgeführt werden, weist der Kernel jedem der sha1sum-Prozesse die proportionale CPU-Zeit basierend auf der jeweiligen cpu.weight-Datei von cgroup wie folgt zu:

    Untergeordnete Gruppe Einstellung cpu.weight Prozentsatz der CPU-Zeitzuweisung
    g1 150 ~50% (150/300)
    g2 100 ~33% (100/300)
    g3 50 ~16% (50/300)

    Wenn für eine untergeordnete Gruppe keine laufenden Prozesse vorhanden sind, wird die CPU-Zeitzuweisung für laufende Prozesse basierend auf der Gesamtgewichtung der verbleibenden untergeordneten Gruppen mit laufenden Prozessen neu berechnet. Beispiel: Wenn die untergeordnete Gruppe g2 keine laufenden Prozesse aufweist, wird die Gesamtgewichtung 200, d.h. die Gewichtung g1+g3. In diesem Fall wird die CPU-Zeit für g1 zu 150/200 (~75%) und für g3, 50/200 (~25%)

  4. Prüfen Sie, ob die Anwendungen in den angegebenen Kontrollgruppen ausgeführt werden.
    sudo cat /proc/33301/cgroup /proc/33302/cgroup /proc/33303/cgroup
    0::/MyGroups/g1
    0::/MyGroups/g2
    0::/MyGroups/g3
  5. Prüfen Sie den aktuellen CPU-Verbrauch, nachdem Sie die CPU-Gewichte festgelegt haben.
    top
    ...
    PID   USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
    33301 root      20   0   18720   1748   1460 R  49.5   0.0 415:05.87 sha1sum
    33302 root      20   0   18720   1756   1464 R  32.9   0.0 412:58.33 sha1sum
    33303 root      20   0   18720   1860   1568 R  16.3   0.0 411:03.12 sha1sum
    760 root      20   0  416620  28540  15296 S   0.3   0.7   0:10.23 tuned
    1 root      20   0  186328  14108   9484 S   0.0   0.4   0:02.00 systemd
    2 root      20   0       0      0      0 S   0.0   0.0   0:00.01 kthread
    ...