VorwortDer 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. Zusammensetzung der KontrollgruppeCgroup besteht im Wesentlichen aus den folgenden zwei Teilen
Sie können überprüfen, welche Subsystemzuordnungen das aktuelle System unterstützt, indem Sie das Verzeichnis /proc/cgroup anzeigen. 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 FunktionenEs bietet die folgenden Funktionen
Im Allgemeinen können wir cgroup für die folgenden Dinge verwenden
Cgroup erscheint als Dateisystem in Linux. Führen Sie den folgenden Befehl aus 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. CPU-Begrenzung in einer Kontrollgruppe In der Kontrollgruppe umfassen die CPU-bezogenen Subsysteme cpusets, cpuacct und cpu. Dann erstellen wir eine Untergruppe unter /sys/fs/cgroup/cpu, die Dateiliste unter diesem Verzeichnis 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. Überprüfen Sie beim Ausführen mit top, ob die Auslastung 100 % erreicht hat 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. Führen Sie top erneut aus und Sie können sehen, dass die CPU-Auslastung gesunken ist. 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 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 Die Funktion jeder Datei wird im Folgenden kurz vorgestellt:
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 Fügen Sie den obigen Beispielprozess zu dieser Kontrollgruppe hinzu, wie in der folgenden Abbildung gezeigt 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. 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. Werfen wir einen Blick auf die Dateien im Testverzeichnis Dabei gibt pids.current die Gesamtzahl der Prozesse in der aktuellen Kontrollgruppe und allen ihren untergeordneten Kontrollgruppen an. pids.max Die maximale Anzahl von Prozessen, die von der aktuellen Kontrollgruppe und allen ihren untergeordneten Kontrollgruppen erstellt werden dürfen. Machen wir ein Experiment und setzen pids.max auf 1 Fügen Sie dann den aktuellen Bash-Prozess zur Cgroup hinzu Führen Sie einen Befehl nach dem Zufallsprinzip aus. Da pids.current im aktuellen Fenster gleich pids.max ist, schlägt die Prozesserstellung fehl. 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 Die aktuelle Anzahl der Prozesse beträgt 2 Öffnen Sie erneut ein Shell-Fenster, erstellen Sie eine untergeordnete Kontrollgruppe und setzen Sie pids.max auf 5. Schreiben Sie den Bash-Prozess der aktuellen Shell in croup.procs 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 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:
|
<<: Erläuterung der CSS3-Überlaufeigenschaft
>>: javascript:void(0) Bedeutung und Anwendungsbeispiele
Inhaltsverzeichnis Überblick Was ist die O-Notati...
Da Springboot über einen integrierten Tomcat-Serv...
Wenn Sie auf einem Windows-Server regelmäßig Date...
1. Die Ränder von Geschwisterelementen zusammenfü...
Inhaltsverzeichnis Vorwort Ursache Phänomen warum...
1. MySQL herunterladen URL: https://dev.mysql.com...
Inhaltsverzeichnis Erstellen eines Layouts CSS-St...
Dieser Blog ist eine Arbeitsnotiz Umfeld: Nginx-V...
1. Brigde——Bridge: VMnet0 wird standardmäßig verw...
Im vorherigen Artikel wurde erläutert, wie Sie mi...
Als nächstes werde ich Java+Tomcat auf Centos7 in...
Würmer replizieren sich, wie der Name schon sagt,...
Der Sortierbefehl wird sehr häufig verwendet, ver...
Redis ist eine Open-Source-NoSQL-Datenbank, die i...
Inhaltsverzeichnis Einführung So stellen Sie eine...