Dieser Artikel hilft Ihnen, die spezifische Verwendung von cgroup in Docker gründlich zu verstehen

Dieser Artikel hilft Ihnen, die spezifische Verwendung von cgroup in Docker gründlich zu verstehen

Vorwort

Der Prozess nutzt CPU, Speicher, Festplatte und andere Rechenressourcen oder Speicherressourcen im System relativ willkürlich. Wir hoffen, die Nutzung der Prozessressourcen zu begrenzen und die Nutzung der Prozessressourcen zu verfolgen. Dies ermöglicht die Entstehung von cgroups, mit deren Hilfe Prozesse einheitlich gruppiert und Ressourcen auf Basis von Gruppen überwacht und gesteuert werden können.

Was ist cgroup

Linux CGroup (Linux Control Group) ist eigentlich eine Funktion des Linux-Kernels. Es handelt sich dabei um einen Mechanismus unter Linux zur Verwaltung von Prozessen nach Gruppen. Es wurde erstmals 2006 von den Google-Ingenieuren Paul Menage und Rohit Seth initiiert und hieß ursprünglich „Prozesscontainer“. Nach 2007 wurde es mit der Einführung von Containern in cgroup umbenannt, um Verwirrung zu vermeiden, und in die Kernelversion 2.6.24 integriert.
Aus Sicht der Benutzerebene organisiert die cgroup-Technologie alle Prozesse im System in unabhängigen Bäumen. Jeder Baum enthält alle Prozesse des Systems. Jeder Knoten des Baums ist eine Prozessgruppe, und jeder Baum ist einem oder mehreren Subsystemen zugeordnet. Der Baum wird hauptsächlich zum Gruppieren von Prozessen verwendet und das Subsystem wird zum Bearbeiten dieser Gruppen verwendet.

Zusammensetzung der Kontrollgruppe

Cgroup besteht im Wesentlichen aus den folgenden zwei Teilen

  • Subsystem: Ein Subsystem ist ein Kernelmodul. Nachdem es mit einem Kontrollgruppenbaum verknüpft wurde, führt es bestimmte Operationen an den Baumknoten aus. Das Subsystem wird häufig als „Ressourcencontroller“ bezeichnet, da es hauptsächlich zum Planen oder Begrenzen der Ressourcen jeder Prozessgruppe verwendet wird. Diese Aussage ist jedoch nicht ganz korrekt, da wir Prozesse manchmal nur gruppieren, um eine gewisse Überwachung durchzuführen und ihren Status zu beobachten, wie z. B. das Subsystem perf_event.
  • Hierarchie: Eine Hierarchie kann als Kontrollgruppenbaum verstanden werden. Jeder Knoten des Baums ist eine Prozessgruppe, und jeder Baum ist mehreren Subsystemen zugeordnet. In einem Baum werden zwar alle Prozesse des Linux-Systems erfasst, allerdings kann jeder Prozess nur zu einem Knoten (Prozessgruppe) gehören. Es kann viele Kontrollgruppenbäume im System geben, jeder Baum ist mit einem anderen Subsystem verknüpft und ein Prozess kann zu mehreren Bäumen gehören, das heißt, ein Prozess kann zu mehreren Prozessgruppen gehören, die mit verschiedenen Subsystemen verknüpft sind.

Sie können überprüfen, welche Subsystemzuordnungen das aktuelle System unterstützt, indem Sie das Verzeichnis /proc/cgroup anzeigen.

Bildbeschreibung hier einfügen

Die erste Spalte: gibt den Subsystemnamen an

Die zweite Spalte: gibt die ID des zugehörigen Kontrollgruppenbaums an. Wenn mehrere Subsysteme demselben Kontrollgruppenbaum zugeordnet sind, sind ihre Felder identisch. Beispielsweise cpuset, cpu und cpuacct in der Abbildung.

Die dritte Spalte: Gibt die Anzahl der Prozessgruppen im mit dem Subsystem verknüpften Kontrollgruppenbaum an, d. h. die Anzahl der Knoten im Baum.

Von cgroup bereitgestellte Funktionen

Es bietet die folgenden Funktionen

  • Ressourcenbeschränkung: Beschränkung der Ressourcennutzung
  • Priorisierung: Prioritätensteuerung
  • Buchhaltung: einige Prüfungen oder Statistiken
  • Steuerung: Den Prozess anhalten und den Ausführungsprozess fortsetzen

Im Allgemeinen können wir cgroup für die folgenden Dinge verwenden

  • Isolieren Sie eine Reihe von Prozessen (z. B. alle MySQL-Prozesse) und begrenzen Sie die von ihnen verwendeten Ressourcen, z. B. gebundene Kernlimits.
  • Speicher für diese Gruppe von Prozessen zuweisen
  • Weisen Sie dieser Gruppe von Prozessen ausreichend Bandbreite und Speicherlimits zu.
  • Beschränken Sie den Zugriff auf bestimmte Geräte

Cgroup erscheint als Dateisystem in Linux. Führen Sie den folgenden Befehl aus

Bildbeschreibung hier einfügen

Nachdem die Bereitstellung erfolgreich war, können Sie sehen, dass sich unter /sys/fs ein Cgroup-Verzeichnis befindet, das viele Subsysteme enthält. Zum Beispiel CPU, CPUSet, BLKIO usw.
Erstellen Sie dann einen Unterverzeichnistest im Verzeichnis /sys/fs/cgroup/cpu. Zu diesem Zeitpunkt werden Sie feststellen, dass sich in diesem Verzeichnis viele weitere Dateien befinden.

Bildbeschreibung hier einfügen

CPU-Begrenzung in einer Kontrollgruppe

In der Kontrollgruppe umfassen die CPU-bezogenen Subsysteme cpusets, cpuacct und cpu.
Unter ihnen wird cpuset hauptsächlich verwendet, um die Affinität der CPU einzustellen. Es kann die Prozesse in der Kontrollgruppe so einschränken, dass sie nur auf der angegebenen CPU ausgeführt werden oder nicht. Gleichzeitig kann cpuset auch die Affinität des Speichers einstellen. cpuacct enthält Statistiken über die von der aktuellen Kontrollgruppe verwendete CPU. Hier sprechen wir nur über die folgenden CPUs.

Dann erstellen wir eine Untergruppe unter /sys/fs/cgroup/cpu, die Dateiliste unter diesem Verzeichnis

Bildbeschreibung hier einfügen

cpu.cfs_period_us wird verwendet, um die Länge des Zeitraums zu konfigurieren, und cpu.cfs_quota_us wird verwendet, um die Menge an CPU-Zeit zu konfigurieren, die die aktuelle Kontrollgruppe innerhalb der festgelegten Zeitraumlänge verwenden kann. Die beiden Dateien arbeiten zusammen, um die Obergrenze der CPU-Auslastung festzulegen. Die Einheiten beider Dateien sind Mikrosekunden (us). Der Wertebereich von cpu.cfs_period_us beträgt 1 Millisekunde (ms) bis 1 Sekunde (s). Der Wert von cpu.cfs_quota_us kann größer als 1 ms sein.
Lassen Sie uns anhand eines Beispiels erklären, wie man das CPU-Limit verwendet. Wenn wir eine Endlosschleife schreiben

Bildbeschreibung hier einfügen

Überprüfen Sie beim Ausführen mit top, ob die Auslastung 100 % erreicht hat

Bildbeschreibung hier einfügen

Wir führen den folgenden Befehl aus, um cfs_quota_us festzulegen

echo 20000 > /sys/fs/cgroup/cpu/test/cpu.cfs_quota_us

Dieser Befehl reduziert die CPU-Auslastung des Prozesses um 20 % und fügt die Prozess-PID zur Kontrollgruppe hinzu.

Bildbeschreibung hier einfügen

Führen Sie top erneut aus und Sie können sehen, dass die CPU-Auslastung gesunken ist.

Bildbeschreibung hier einfügen

Begrenzen des Speichers in einer Kontrollgruppe

Wenn der Code Fehler wie Speicherlecks aufweist, wird der Systemspeicher geleert und andere Programme verhalten sich aufgrund unzureichender Speicherzuweisung abnormal. Wenn das System mit einer Swap-Partition konfiguriert ist, wird das System einen großen Teil der Swap-Partition verwenden, wodurch das System sehr langsam läuft.
Die Hauptsteuerung der Kontrollgruppe im Prozessspeicher erfolgt wie folgt:

  • Begrenzen Sie den Gesamtspeicher, der von allen Prozessen in der Kontrollgruppe verwendet wird
  • Begrenzen Sie die Gesamtmenge an physischem Inhalt + Swap, die von allen Prozessen in der Kontrollgruppe verwendet wird
  • Begrenzen Sie die Gesamtmenge an Kernelspeicher und anderen Kernelressourcen, die von allen Prozessen in der Kontrollgruppe verwendet werden können (CONFIG_MEMCG_KMEM).

Die Begrenzung des Kernelspeichers bedeutet hier die Begrenzung der aktuell von der Kontrollgruppe verwendeten Kernelressourcen, einschließlich des vom aktuellen Prozess belegten Kernelspeichers, des vom Socket belegten Speicherplatzes usw. Bei knappem Speicher kann die aktuelle Kontrollgruppe daran gehindert werden, weiterhin Prozesse zu erstellen und weitere Kernelressourcen vom Kernel anzufordern.

Das folgende Beispiel zeigt, wie cgroup den Speicher steuern kann.

#include <iostream>
#include <sys/types.h>
#include <cstdlib>
#einschließen <cstdio>
#include <string.h>
#include <unistd.h>

#definieren CHUNK_SIZE 512


int main()
{
   int-Größe = 0;
   char *p = nullptr; 
   während(1)
   {
          wenn((p = (char*)malloc(CHUNK_SIZE))==nullptr)
          {
              brechen;
         }

      memset(p, 0, CHUNK_SIZE);
       printf("[%u]-- [%d]MB ist zugeordnet ", getpid(), ++size);
       Schlaf (1);
   }
    
   gebe 0 zurück;
}

Erstellen Sie zunächst ein Unterverzeichnis unter /sys/fs/cgroup/memory, um eine Untergruppe zu erstellen. Hier erstellen wir beispielsweise ein Testverzeichnis

$mkdir /sys/fs/cgroup/speicher/test

Das Testverzeichnis enthält die folgenden Dateien

Bildbeschreibung hier einfügen

Die Funktion jeder Datei wird im Folgenden kurz vorgestellt:

dokumentieren veranschaulichen
cgroup.ereignissteuerung Schnittstelle für eventfd
Speicherverbrauch in Bytes Zeigt den aktuell belegten Speicher an
Speicherlimit in Bytes Aktuelles Speicherlimit setzen/anzeigen
Speicher.failcnt Zeigt an, wie oft die Speichernutzung den Grenzwert erreicht
Speicher.max_usage_in_bytes Maximale historische Speichernutzung
Speicher.Soft_Limit_in_Bytes Aktuelles Speicherlimit setzen/anzeigen
Speicher.stat Zeigt die Speichernutzung der aktuellen Kontrollgruppe an
Speicherverwendungshierarchie Festlegen/Anzeigen, ob die Speichernutzung von untergeordneten Kontrollgruppen in die aktuelle Kontrollgruppe einbezogen werden soll
Speicher.force_empty Lösen Sie aus, dass das System sofort so viel wiederverwendbaren Speicher wie möglich in der aktuellen Kontrollgruppe zurückfordert.
Speicherdruckstufe Legen Sie das Benachrichtigungsereignis für den Speicherdruck fest und verwenden Sie es zusammen mit cgroup.event_control
Speicher.Swapping Festlegen und Anzeigen der aktuellen Swappiness
Speicher.move_charge_at_immigrate Legt fest, ob der von einem Prozess belegte Speicher ebenfalls verschoben wird, wenn dieser in eine andere Kontrollgruppe verschoben wird.
Speicher.oom_control Festlegen/Anzeigen der Konfiguration für Raumsteuerungen
Speicher.numa_stat Anzeige des NUMA-bezogenen Speichers

Legen Sie dann das Limit fest, indem Sie die Datei memory.limit_in_bytes schreiben. Hier wird ein Limit von 5M festgelegt, wie in der folgenden Abbildung dargestellt

Bildbeschreibung hier einfügen

Fügen Sie den obigen Beispielprozess zu dieser Kontrollgruppe hinzu, wie in der folgenden Abbildung gezeigt

Bildbeschreibung hier einfügen

Um eine Beeinträchtigung durch den Swap-Speicher zu vermeiden, setzen Sie die Swappiness auf 0, um der aktuellen Cgroup die Nutzung von Swap zu verbieten, wie in der folgenden Abbildung dargestellt.

Bildbeschreibung hier einfügen

Wenn der physische Speicher die Obergrenze erreicht, besteht das Standardverhalten des Systems darin, den Prozess in der Kontrollgruppe zu beenden, der weiterhin Speicher anfordert. Wie also kontrollieren Sie dieses Verhalten? Damit wird memory.oom_control konfiguriert. Diese Datei enthält ein Flag, das steuert, ob OOM-Killer für die aktuelle Kontrollgruppe gestartet wird. Wenn 0 in diese Datei geschrieben wird, wird OOM-Killer gestartet. Wenn der Kernel dem Prozess nicht genügend Speicher zuweisen kann, wird er den Prozess direkt beenden. Wenn 1 in diese Datei geschrieben wird, wird OOM-Killer nicht gestartet. Wenn der Kernel dem Prozess nicht genügend Speicher zuweisen kann, wird er den Prozess anhalten, bis freier Speicher vorhanden ist, und dann weiter ausgeführt. Gleichzeitig enthält memory.oom_control auch ein schreibgeschütztes under_oom-Feld, das verwendet wird, um anzuzeigen, ob der aktuelle Status in den OOM-Status eingetreten ist, d. h. ob ein Prozess angehalten wurde. Es gibt auch ein schreibgeschütztes „killed_oom“-Feld, das angibt, ob ein Prozess beendet wurde.

Begrenzen Sie die Anzahl der Cgoup-Prozesse

In der Kontrollgruppe gibt es ein Subsystem namens „pids“, das die Gesamtzahl der Aufgaben begrenzt, die in der Kontrollgruppe und allen untergeordneten Kontrollgruppen erstellt werden können. Die Aufgabe bezieht sich hier auf den Prozess, der durch die Fork- und Klonfunktionen erstellt wird. Da die Klonfunktion auch Threads erstellen kann, umfasst die Aufgabe hier auch Threads.
Der Cgroup-Baum wurde zuvor gemountet, daher erstellen wir hier direkt eine untergeordnete Cgroup und nennen sie Test. Der Befehl wird unten angezeigt

Bildbeschreibung hier einfügen

Werfen wir einen Blick auf die Dateien im Testverzeichnis

Bildbeschreibung hier einfügen

Dabei gibt pids.current die Gesamtzahl der Prozesse in der aktuellen Kontrollgruppe und allen ihren untergeordneten Kontrollgruppen an.

Bildbeschreibung hier einfügen

pids.max Die maximale Anzahl von Prozessen, die von der aktuellen Kontrollgruppe und allen ihren untergeordneten Kontrollgruppen erstellt werden dürfen.

Bildbeschreibung hier einfügen

Machen wir ein Experiment und setzen pids.max auf 1

Bildbeschreibung hier einfügen

Fügen Sie dann den aktuellen Bash-Prozess zur Cgroup hinzu

Bildbeschreibung hier einfügen

Führen Sie einen Befehl nach dem Zufallsprinzip aus. Da pids.current im aktuellen Fenster gleich pids.max ist, schlägt die Prozesserstellung fehl.

Bildbeschreibung hier einfügen

Die pids.current und pids.max in der aktuellen Kontrollgruppe repräsentieren alle Prozesse der aktuellen Kontrollgruppe und aller untergeordneten Kontrollgruppen, sodass die Größe von pids.max in der untergeordneten Kontrollgruppe die Größe in der übergeordneten Kontrollgruppe nicht überschreiten kann. Was passiert, wenn sie überschritten wird? Wir setzen pids.max auf 3

Bildbeschreibung hier einfügen

Die aktuelle Anzahl der Prozesse beträgt 2

Bildbeschreibung hier einfügen

Öffnen Sie erneut ein Shell-Fenster, erstellen Sie eine untergeordnete Kontrollgruppe und setzen Sie pids.max auf 5.

Bildbeschreibung hier einfügen

Schreiben Sie den Bash-Prozess der aktuellen Shell in croup.procs

Bildbeschreibung hier einfügen

Gehen Sie zurück zum ursprünglichen Shell-Fenster und führen Sie einen beliebigen Befehl aus, um zu sehen, dass die Ausführung fehlgeschlagen ist

Bildbeschreibung hier einfügen

Wie Sie sehen, ist die Anzahl der Prozesse in einer untergeordneten Kontrollgruppe nicht nur durch ihre eigene pids.max-Zahl begrenzt, sondern auch durch die pids.max-Zahl der übergeordneten Kontrollgruppe.

Dies ist das Ende dieses Artikels, in dem erklärt wird, wie man die spezifische Verwendung von cgroup in Docker gründlich versteht. Weitere relevante Docker-cgroup-Inhalte finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder durchsuchen Sie die folgenden verwandten Artikel weiter. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Detaillierte Erklärung von Cgroup, dem Kernprinzip von Docker
  • Detaillierte Erläuterung der Anwendung der Docker-Basistechnologie Namespace Cgroup
  • Detaillierte Erläuterung der Docker-Cgroup-Ressourcenüberwachung
  • Detaillierte Erklärung zur Verwendung von cgroups zur Begrenzung der Ressourcennutzung in Docker-Containern

<<:  Erläuterung der CSS3-Überlaufeigenschaft

>>:  javascript:void(0) Bedeutung und Anwendungsbeispiele

Artikel empfehlen

So lernen Sie algorithmische Komplexität mit JavaScript

Inhaltsverzeichnis Überblick Was ist die O-Notati...

Implementierung eines geplanten MySQL-Sicherungsskripts unter Windows

Wenn Sie auf einem Windows-Server regelmäßig Date...

Lösen Sie das Problem der Randzusammenführung

1. Die Ränder von Geschwisterelementen zusammenfü...

MySQL sollte niemals Update-Anweisungen wie diese schreiben

Inhaltsverzeichnis Vorwort Ursache Phänomen warum...

Detailliertes Tutorial zur Installation von Mysql5.7.19 auf Centos7 unter Linux

1. MySQL herunterladen URL: https://dev.mysql.com...

JavaScript implementiert eine Seiten-Scrolling-Animation

Inhaltsverzeichnis Erstellen eines Layouts CSS-St...

So verwenden Sie GeoIP, um Regionen in Nginx einzuschränken

Dieser Blog ist eine Arbeitsnotiz Umfeld: Nginx-V...

Drei Netzwerkmethoden und Prinzipien von virtuellen VMware-Maschinen (Zusammenfassung)

1. Brigde——Bridge: VMnet0 wird standardmäßig verw...

Grundlegende Kenntnisse zur MySQL-Wurmreplikation

Würmer replizieren sich, wie der Name schon sagt,...

Eine Frage zum Verständnis mehrerer Parameter des Sortierbefehls in Linux

Der Sortierbefehl wird sehr häufig verwendet, ver...