Heim > Artikel > Betrieb und Instandhaltung > Fünf Minuten technischer Spaß |. Eine kurze Analyse der hierarchischen Regeln der Linux-Cgroup
cgroup ist die Abkürzung für Control Groups. Dabei handelt es sich um eine Art physische Ressourcen (z. B. CPU, Speicher, Geräte-E/A), die vom Linux-Kernel bereitgestellt werden können Prozesse oder Prozessgruppen usw. steuern) Mechanismen zur Einschränkung, Isolation und Statistik. Die Benutzerraumverwaltung von cgroup wird über das cgroup-Dateisystem realisiert. Dank des virtuellen Dateisystems von Linux werden die Details des Dateisystems ausgeblendet, und der Benutzer erkennt die Verwendung dieser Funktion über die relevanten Steuerdateien.
cgroup wurde von Google während der 2.6-Kernel-Periode eingeführt. Es ist die technische Grundlage für die Ressourcenvirtualisierung im Linux-Kernel und der technische Eckpfeiler von LXC (Linux Containers) und Docker-Containern. Es gibt die folgenden verwandten Konzepte in cgroup:
Teil 02 cgroup-Subsystem
Das. Subsystem hängt mit der Kernel-Version zusammen, die Ressourcen, die vorhanden sein können begrenzt Es gibt auch immer mehr, im Allgemeinen einschließlich der folgenden Subsysteme.
➤ blkio: Legen Sie Beschränkungen für den Eingabe-/Ausgabezugriff fest, um Geräte wie physische Geräte (Festplatte, SSD, USB usw.) zu blockieren.
➤ CPU: Begrenzen Sie die CPU-Nutzung des Prozesses, einschließlich der Zuweisung von CPU-Zeitscheiben.
➤ cpuacct: Automatisch einen CPU-Bericht generieren, der von Aufgaben in der cgroup verwendet wird.
➤ cpuset: Unabhängige CPU (Multi-Core-System) und Speicherknoten den Aufgaben in der cgroup zuweisen.
➤ Geräte: Zulassen oder verweigern, dass Aufgaben in der Kontrollgruppe auf das Gerät zugreifen.
➤ Freezer: Aufgaben in einer Gruppe aussetzen oder fortsetzen.
➤ Speicher: Legen Sie das von Aufgaben in einer Kontrollgruppe verwendete Speicherlimit fest und erstellen Sie automatisch einen Bericht über die von diesen Aufgaben verwendeten Speicherressourcen.
➤ net_cls: Durch das Markieren von Netzwerkpaketen mit Klassenkennungen kann das Linux-Wanderkontrollprogramm Pakete identifizieren, die von bestimmten Kontrollgruppen generiert wurden.
➤ ns: Namespace-Subsystem.
In Kombination mit der cgroup-Hierarchie kann es als Baum verstanden werden. Jeder Knoten des Baums ist eine Prozessgruppe, und jeder Baum wird es sein verbunden mit mehreren Subsystemen. In einem Baum werden alle Prozesse im Linux-System enthalten, aber jeder Prozess kann nur zu einem Knoten (Prozessgruppe) gehören. Es kann viele Kontrollgruppenbäume im System geben, und jeder Baum ist einem anderen Subsystem zugeordnet. Ein Prozess kann mehreren Bäumen angehören, das heißt, ein Prozess kann mehreren Prozessgruppen angehören, diese Prozessgruppen sind jedoch unterschiedlichen Subsystemen zugeordnet. Derzeit kann Linux bis zu zwölf Cgroup-Bäume erstellen, und jeder Baum ist einem Subsystem zugeordnet. Natürlich können Sie auch nur einen Baum erstellen und diesen Baum dann allen Subsystemen zuordnen. Wenn ein cgroup-Baum keinem Subsystem zugeordnet ist, bedeutet dies, dass der Baum nur Prozesse gruppiert, die auf der Gruppierung basieren. Systemd ist ein solches Beispiel.
Es gibt vier Zusammensetzungsregeln für die Hierarchie, die wie folgt beschrieben werden:
Regel 1: Eine einzelne Hierarchie kann ein oder mehrere Subsysteme haben. Wie in Abbildung 1 dargestellt, richtet die Ebene /cpu_memory_cg zwei Subsysteme ein, CPU und Speicher, für cgroup1 und cgroup2.
Abbildung 1 Hierarchieregel 1
Regel 2: Wenn ein Subsystem bereits einer Ebene zugeordnet ist, kann es nicht der Struktur einer anderen Ebene zugeordnet werden. Wie in Abbildung 2 dargestellt, verwaltet cpu_cg auf Ebene A zunächst das CPU-Subsystem, dann kann cpu_mem_cg auf Ebene B das CPU-Subsystem nicht verwalten.
Abbildung 2 Gruppenhierarchieregel 2
Regel 3: Jedes Mal, wenn eine neue Hierarchie auf einem System erstellt wird, sind alle Aufgaben auf dem System zunächst Mitglieder der Standard-Kontrollgruppe dieser Hierarchie (die sogenannte Stamm-Kontrollgruppe). Für jede einzelne erstellte Hierarchie kann jede Aufgabe im System ein Kontrollgruppenmitglied in dieser Hierarchie sein. Eine Aufgabe kann in mehreren Kontrollgruppen enthalten sein, solange sich jede dieser Kontrollgruppen in einer anderen Subsystemhierarchie befindet. Sobald eine Aufgabe Mitglied der zweiten Kontrollgruppe in derselben Hierarchie wird, wird sie aus der ersten Kontrollgruppe in der Hierarchie gelöscht. Das heißt, dass zwei verschiedene Kontrollgruppen in derselben Hierarchie niemals dieselbe Aufgabe haben kann nur eine Möglichkeit sein, einen bestimmten Typ von Cgroup-Subsystem für einen bestimmten Prozess einzuschränken. Wenn Sie die erste Hierarchie erstellen, ist jede Aufgabe im System Mitglied von mindestens einer Kontrollgruppe (der Stammkontrollgruppe). Wenn Sie also Kontrollgruppen verwenden, befindet sich jede Systemaufgabe immer in mindestens einer Kontrollgruppe, wie in Abbildung 3 dargestellt.
Abbildung 3 cgroup-Hierarchie, Regel 3
Regel 4: Jeder auf dem System gegabelte Prozess erstellt einen untergeordneten Prozess (oder Thread). Der untergeordnete Prozess erbt automatisch die Kontrollgruppenmitgliedschaft seines übergeordneten Prozesses, kann jedoch bei Bedarf in andere Kontrollgruppen verschoben werden. Nach dem Verschieben sind der übergeordnete und untergeordnete Prozess völlig unabhängig, wie in Abbildung 4 dargestellt.
Abbildung 4 cgroup-Hierarchieregel 4
Wir beginnen aus der Perspektive des Prozesses und kombinieren Die Datenstruktur im Quellcode wird verwendet, um die Beziehung zwischen cgroups-bezogenen Daten zu analysieren. Erstens ist unter Linux die Datenstruktur zum Verwalten von Prozessen task_struct, in der die mit cgroups verbundenen Mitglieder wie folgt lauten: Hier werden prozessbezogene Cgroup-Informationen gespeichert. cg_list ist eine prozessverknüpfte Liste, die dasselbe css_set verwendet. Die css_set-Struktur lautet wie folgt:
Die Elementinformationen der Struktur werden wie folgt erklärt:
refcount ist der Referenzzähler von. css _set, was kann von mehreren Prozessen gemeinsam genutzt werden, solange die cgroups-Informationen dieser Prozesse gleich sind. Beispielsweise Prozesse in derselben Kontrollgruppe in allen erstellten Hierarchien.
hlist wird verwendet, um alle CSS-Sets in einer Hash-Tabelle zusammenzustellen, und der Kernel kann schnell bestimmte CSS-Sets finden.
Der cgroup-Zeiger in der Struktur wird durch die Ressourcen des Subsystems gesteuert. Dies wird tatsächlich durch den Beitritt zu einem bestimmten cgroup-Subsystem erreicht einer bestimmten Ebene sind Subsysteme zugeordnet.
Werfen wir einen Blick auf die Struktur der Kontrollgruppe.
Um die Beziehung zwischen css_set und cgroup zu klären, müssen wir auch die cg_cgroup_link-Struktur der mittleren Ebene analysieren. Die Strukturdaten lauten wie folgt:
Die Daten in der Struktur werden wie folgt beschrieben:
cgrp_link_list ist mit der verknüpften Liste verknüpft, auf die cgroup->css_sets verweist.
cgrp verweist auf die Gruppe, die mit diesem cg_cgroup_link verknüpft ist.
cg_link_list ist mit der verknüpften Liste verknüpft, auf die css_set->cg_links verweist.
cg verweist auf das css_set, das sich auf cg_cgroup_link bezieht.
Es ist ersichtlich, dass cgroup und css_set tatsächlich eine Viele-zu-Viele-Beziehung sind, um die beiden Elemente cgrp und cg zu kombinieren Die verknüpften Listen von cgrp_link_list und cg_link_list sind die angehängten cgroup- und css_set-Entitäten, um die Abfrage zu erleichtern.
Aus den hierarchischen Regeln von cgroup geht hervor, dass eine Gruppe von Prozessen zu cgroups gehören kann, die sich nicht auf derselben Ebene befinden. Zusammengenommen speichert ein css_set Informationen zu jedem Subsystem einer Gruppe von Prozesswurzeln . Das Subsystem stammt aus verschiedenen cgroup-Ebenen, sodass der in einem css_set gespeicherte cgroup_subsys_state mehreren cgroups entsprechen kann. Andererseits speichert die cgroup-Ebene auch einen Satz von cgroup_subsys_state, der von dem Subsystem abgerufen wird, das der Ebene zugeordnet ist, auf der sich die cgroup befindet. Eine cgroup kann mehrere Prozesse haben, und der css_set des Prozesses ist nicht unbedingt derselbe. Da der Prozess möglicherweise mehrere Ebenen verwendet, muss eine cgroup auch mehreren css_sets entsprechen. Abbildung 5 beschreibt die Viele-zu-Viele-Hooking-Beziehung im Detail.
Abbildung 5 Prozess- und Gruppen-Viele-zu-Viele-Beziehungsdiagramm
Basierend auf dem Konzept der cgroup zerlegt dieser Artikel die Viele-zu-Viele-Beziehung zwischen ihr und dem Prozess und analysiert sie anhand der Verknüpfung von Variablen in den relevanten Die spezifische Code-Implementierung soll den Lesern helfen, die hierarchische Beziehung und Verwendung von cgroups besser zu verstehen.
Das obige ist der detaillierte Inhalt vonFünf Minuten technischer Spaß |. Eine kurze Analyse der hierarchischen Regeln der Linux-Cgroup. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!