Heim  >  Artikel  >  Betrieb und Instandhaltung  >  Fünf Minuten technischer Spaß |. Eine kurze Analyse der hierarchischen Regeln der Linux-Cgroup

Fünf Minuten technischer Spaß |. Eine kurze Analyse der hierarchischen Regeln der Linux-Cgroup

WBOY
WBOYnach vorne
2023-06-09 14:18:481981Durchsuche

五分钟技术趣谈 | Linux Cgroup层级规则简析

Teil 01 cgroup-Übersicht

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:

  • Aufgabe: Ein Alias ​​für den Prozess;
  • Kontrollgruppe: Folgen Sie einem bestimmten A-Satz von Prozessen geteilt durch einen Standard. Die Ressourcenkontrolle in Cgroup wird in Einheiten von Kontrollgruppen implementiert. Ein Prozess kann einer Kontrollgruppe hinzugefügt oder von einer Prozessgruppe in eine andere migriert werden. Prozesse in einer Prozessgruppe können von cgroups zugewiesene Ressourcen in Einheiten von Kontrollgruppen nutzen und unterliegen Ressourcenbeschränkungen, die von cgroup in Einheiten von Kontrollgruppen festgelegt werden.
  • Hierarchie: Die hierarchische Beziehung der Kontrollgruppe ist in einer Baumstruktur organisiert. Die Kontrollgruppe des untergeordneten Knotens erbt die Ressourceneinstellungsattribute des übergeordneten Knotens.
  • Subsystem (Subsystem): Ein Subsystem ist ein Ressourcencontroller. Beispielsweise kann das CPU-Subsystem die CPU-Nutzungszeitzuteilung steuern, wie in Abbildung 1 dargestellt. Um zu funktionieren, muss ein Subsystem einer Ebene zugeordnet werden. Nachdem ein Subsystem einer bestimmten Ebene zugeordnet wurde, werden alle Kontrollgruppen auf dieser Ebene von diesem Subsystem gesteuert.

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.

Teil 03 cgroup-Hierarchieregeln

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.

五分钟技术趣谈 | Linux Cgroup层级规则简析

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.

五分钟技术趣谈 | Linux Cgroup层级规则简析

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.

五分钟技术趣谈 | Linux Cgroup层级规则简析

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.

五分钟技术趣谈 | Linux Cgroup层级规则简析

Abbildung 4 cgroup-Hierarchieregel 4


Teil 04cgroup-Hierarchie-Beziehungsanalyse

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:

五分钟技术趣谈 | Linux Cgroup层级规则简析

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. 五分钟技术趣谈 | Linux Cgroup层级规则简析

hlist wird verwendet, um alle CSS-Sets in einer Hash-Tabelle zusammenzustellen, und der Kernel kann schnell bestimmte CSS-Sets finden.

    tasks verknüpft alle Prozesse, die auf dieses css_set verweisen, in einer verknüpften Liste.
  • cg_links zeigt auf eine verknüpfte Liste, die aus der Struktur cg_group_link besteht.
  • subsys ist ein Zeiger-Array, das eine Reihe von Zeigern auf cgroup_subsys_state speichert. Ein cgroup_subsys_state ist eine Information, die sich auf einen Prozess und ein bestimmtes Subsystem bezieht. Über diesen Zeiger kann der Prozess die entsprechenden Kontrollinformationen der Kontrollgruppe abrufen.
  • Als nächstes werfen wir einen Blick auf die cgroup_subsys_state-Struktur:

    五分钟技术趣谈 | Linux Cgroup层级规则简析

    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.

    • Geschwister, Kinder und Eltern sind drei verknüpfte Listen, die für die Verbindung von Kontrollgruppen auf derselben Ebene in einem Baum verantwortlich sind.
    • susys ist das zuvor beschriebene Subsystem-Zeiger-Array.
    • root zeigt auf eine cgroupfs_root-Struktur, bei der es sich um die Struktur handelt, die der Ebene entspricht, auf der sich die cgroup befindet.
    • root->top_cgroup zeigt auf die Root-Cgroup der aktuellen Ebene, bei der es sich um die automatisch auf der Fantasy Sword-Ebene erstellte Cgroup handelt. Sie können die Stammkontrollgruppe der Hierarchie über cgroup->root->top_cgroup abrufen.
    • css_sets verweist auf eine verknüpfte Liste von cg_cgroup_link, die mit cg_links in css_set übereinstimmt.

    五分钟技术趣谈 | Linux Cgroup层级规则简析

    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:

    五分钟技术趣谈 | Linux Cgroup层级规则简析

    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.

    五分钟技术趣谈 | Linux Cgroup层级规则简析

    Abbildung 5 Prozess- und Gruppen-Viele-zu-Viele-Beziehungsdiagramm

    Teil 05 Fazit

    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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:51cto.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen