Sie haben also von Cgroups gehört und möchten mehr darüber erfahren. Vielleicht haben Sie es bei einem Vortrag über Containerisierung erwähnt. Vielleicht haben Sie sich mit der Optimierung der Linux-Leistung befasst, oder vielleicht haben Sie eines Tages zufällig Ihr Dateisystem durchlaufen und /sys/fs/cgroups
entdeckt . In jedem Fall möchten Sie mehr über diese Funktionalität erfahren, die seit geraumer Zeit in den Kernel eingebacken ist. Lehnen Sie sich also zurück, schnappen Sie sich etwas Popcorn und bereiten Sie sich darauf vor, (hoffentlich) etwas zu lernen, das Sie vielleicht noch nicht wussten.
Was sind Cgroups?
Das Wörterbuch von Webster definiert cgroups wie ... Nur ein Scherz. Ich habe es immer gehasst, Vorträgen zuzuhören, die mit langweiligen Wörterbuchdefinitionen begannen. Stattdessen werde ich versuchen, die technische Definition von cgroups in etwas leicht Verständliches zu destillieren.
Cgroups sind ein großes Thema. Ich habe diese Diskussion in eine vierteilige Serie unterteilt. Teil eins dieses Artikels behandelt die grundlegenden Konzepte von cgroups. Teil zwei untersucht CPUShare eingehender. Teil drei mit dem Titel „Cgroups auf die harte Tour machen“ befasst sich mit administrativen Aufgaben von Cgroups. Schließlich behandelt Teil vier cgroups, wie sie von systemd verwaltet werden.
Wie Sie vielleicht wissen oder nicht wissen, ist der Linux-Kernel dafür verantwortlich, dass die gesamte Hardware auf einem System zuverlässig interagiert. Das bedeutet, abgesehen von den Codebits (Treibern), die es dem Betriebssystem (OS) ermöglichen, die Hardware zu verstehen, setzt es auch Grenzen dafür, wie viele Ressourcen ein bestimmtes Programm vom System verlangen kann. Dies ist am einfachsten zu verstehen, wenn es um die Menge an Arbeitsspeicher (RAM) geht, die ein System auf alle Anwendungen aufteilen muss, die Ihr Computer möglicherweise ausführt. In seiner einfachsten Form darf ein Linux-System die meisten Anwendungen ohne Einschränkung ausführen. Dies kann für allgemeine Computeranwendungen großartig sein, wenn alle Anwendungen gut zusammenspielen. Aber was passiert, wenn es einen Fehler in einem Programm gibt und es beginnt, den gesamten verfügbaren Speicher zu verbrauchen? Der Kernel hat eine Funktion namens Out Of Memory (OOM) Killer. Seine Aufgabe ist es, Anwendungen anzuhalten, um genügend RAM freizugeben, damit das Betriebssystem weiterhin ohne Abstürze funktionieren kann.
Das ist großartig, sagen Sie, aber was hat das mit Cgroups zu tun? Nun, der OOM-Prozess fungiert als letzte Verteidigungslinie, bevor Ihr System um Sie herum zusammenbricht. Es ist bis zu einem gewissen Punkt nützlich, aber da der Kernel steuern kann, welche Prozesse den OOM überleben müssen, kann er auch bestimmen, welche Anwendungen überhaupt nicht zu viel RAM verbrauchen können.
Cgroups sind daher eine in den Kernel integrierte Einrichtung, die es dem Administrator ermöglicht, Ressourcennutzungslimits für jeden Prozess im System festzulegen. Im Allgemeinen kontrollieren cgroups:
- Die Anzahl der CPU-Anteile pro Prozess.
- Die Speichergrenzen pro Prozess.
- Geräte-E/A pro Prozess blockieren.
- Welche Netzwerkpakete als derselbe Typ identifiziert werden, damit eine andere Anwendung Netzwerkverkehrsregeln erzwingen kann.
Es gibt noch mehr Facetten als nur diese, aber das sind die Hauptkategorien, die den meisten Administratoren am Herzen liegen.
Die bescheidenen Anfänge von Cgroups
Kontrollgruppen (cgroups) sind ein Linux-Kernel-Mechanismus zur feinkörnigen Kontrolle von Ressourcen. Ursprünglich von Google-Ingenieuren im Jahr 2006 vorgeschlagen, wurden Cgroups schließlich um 2007 in den Linux-Kernel integriert. Während es derzeit zwei Versionen von Cgroups gibt, verwenden die meisten Distributionen und Mechanismen Version 1, da sie seit 2.6.24 im Kernel enthalten ist. Wie bei den meisten Dingen, die dem Mainline-Kernel hinzugefügt wurden, gab es zunächst keine große Akzeptanzrate. Version 2 setzt diesen Trend fort, nachdem es sie seit fast einem halben Jahrzehnt gibt, aber immer noch nicht weit verbreitet ist.
Ein Problem, das die Einführung von Cgroups plagt, ist das mangelnde Wissen über ihre Existenz und ihre Rolle im modernen Linux-System. Geringes Bewusstsein und Akzeptanz bedeuten oft, dass die Interaktion mit einer Kernel-Schnittstelle umständlich, kompliziert oder einfach nur ein manueller Prozess ist. Das war anfangs bei cgroups der Fall. Sicher, es ist nicht so schwer, einmalige cgroups zu erstellen. Wenn Sie beispielsweise die frühen Tage simulieren wollten, bevor die Tools rund um cgroups entwickelt wurden, könnten Sie eine Reihe von Verzeichnissen erstellen und die cgroup
einhängen Dateisystem und beginnen Sie, alles von Hand zu konfigurieren. Aber bevor wir zu all dem kommen, lassen Sie uns ein wenig darüber sprechen, warum cgroups sind im heutigen Linux-Ökosystem von entscheidender Bedeutung.
Warum Cgroups wichtig sind
Cgroups haben vier eng miteinander verbundene Hauptfunktionen, die sie in einem modernen System sehr wichtig machen, insbesondere wenn Sie eine containerisierte Arbeitslast ausführen.
1. Ressourcenbegrenzung
Wie bereits erwähnt, ermöglichen Cgroups einem Administrator, sicherzustellen, dass Programme, die auf dem System ausgeführt werden, innerhalb bestimmter akzeptabler Grenzen für CPU, RAM, Blockgerät-I/O und Gerätegruppen bleiben.
HINWEIS :Die CGroup für Gerätegruppen kann eine Schlüsselkomponente in der umfassenden Sicherheitsstrategie Ihres Systems sein. Gerätegruppen umfassen das Steuern von Berechtigungen für Lesen, Schreiben und mknod
Operationen. Die Lese-/Schreiboperationen sind ziemlich selbsterklärend, also nehmen wir uns einen Moment Zeit, um einen Blick auf mknod
zu werfen Funktionalität in einem Linux-System. mknod
wurde ursprünglich entwickelt, um alle Dinge aufzufüllen, die in /dev/
auftauchen . Dies sind Dinge wie Festplatten, USB-Schnittstellen für Geräte wie Arduino, ESP8266-Mikrocontroller oder andere Geräte, die möglicherweise auf einem System vorhanden sind. Die meisten modernen Linux-Systeme verwenden udev
um dieses virtuelle Dateisystem automatisch mit Dingen zu füllen, die vom Kernel erkannt wurden. mknod
ermöglicht auch mehreren Programmen, miteinander zu kommunizieren, indem eine benannte Pipe erstellt wird. Dieses Konzept geht über den Umfang dieser Erklärung hinaus, aber es reicht aus zu verstehen, dass dies die Weitergabe von Informationen von einem Programm zu einem anderen erleichtert. Unabhängig davon ist mknod
in einer kontrollierten Umgebung ist etwas, das ein Administrator genau prüfen sollte.
2. Priorisierung
Die Priorisierung unterscheidet sich geringfügig von der Ressourcenbegrenzung, da Sie Prozesse nicht unbedingt einschränken. Stattdessen sagen Sie lediglich, dass unabhängig davon, wie viele Ressourcen verfügbar sind, X verarbeitet werden soll wird immer mehr Zeit auf dem System haben als Prozess Y .
3. Buchhaltung
Während die Abrechnung für die meisten Unternehmensversionen von Linux aufgrund zusätzlicher Ressourcennutzung standardmäßig deaktiviert ist, kann es sehr hilfreich sein, die Ressourcennutzung für einen bestimmten Baum einzuschalten (dazu später mehr). So können Sie sehen, welche Prozesse in welcher Kontrollgruppe welche Typen oder Ressourcen verbrauchen.
4. Prozesskontrolle
Es gibt eine Funktion in cgroups namens freezer . Während ein tieferes Verständnis dieser Funktionalität den Rahmen dieses Artikels sprengen würde, können Sie sich Freezer als die Fähigkeit vorstellen, einen Schnappschuss eines bestimmten Prozesses zu machen und ihn zu verschieben. Siehe die Kernel-Dokumentation für ein tieferes Verständnis.
Okay, was hat das alles zu bedeuten? Nun, aus der Sicht eines Systemadministrators bedeutet es mehrere Dinge.
Erstens bedeutet dies, dass Sie auch ohne Eintauchen in die Containertechnologie eine höhere Dichte auf einem einzelnen Server erreichen können, indem Sie die Art der Arbeitslast, die Anwendungen und die erforderlichen Ressourcen sorgfältig verwalten.
Zweitens verbessert es Ihre Sicherheitslage um einiges. Während eine typische Linux-Installation standardmäßig cgroups verwendet, werden Prozesse nicht eingeschränkt. Sie können standardmäßig Beschränkungen auferlegen, wenn Sie dies wünschen. Sie können auch den Zugriff auf bestimmte Geräte für bestimmte Benutzer, Gruppen oder Prozesse einschränken, was zusätzlich dazu beiträgt, ein System zu sperren.
Schließlich können Sie eine erhebliche Menge an Leistungsoptimierung durch cgroups vornehmen. In Kombination mit tuned können Sie so eine Umgebung schaffen, die speziell auf Ihre individuellen Workloads abgestimmt ist. In großem Umfang oder in einer latenzempfindlichen Umgebung können diese Anpassungen den Unterschied zwischen dem Einhalten oder Verfehlen Ihrer Service Level Agreements (SLAs) ausmachen.
Wie funktionieren Cgroups?
Für die Zwecke dieser Diskussion sprechen wir über cgroups V1 . Während Version 2 in Red Hat Enterprise Linux 8 (RHEL 8) verfügbar ist, ist sie standardmäßig deaktiviert. Die meisten Container-Technologien wie Kubernetes, OpenShift, Docker usw. verlassen sich immer noch auf cgroups Version 1.
Wir haben bereits besprochen, dass cgroups ein Mechanismus zur Steuerung bestimmter Subsysteme im Kernel sind. Diese Subsysteme wie Geräte, CPU, RAM, Netzwerkzugriff usw. werden als Controller bezeichnet in der Cgroup-Terminologie.
Jeder Controllertyp (cpu
, blkio
, memory
, usw.) ist in eine baumartige Struktur unterteilt. Jeder Zweig oder jedes Blatt hat seine eigenen Gewichte oder Grenzen. Einer Kontrollgruppe sind mehrere Prozesse zugeordnet, wodurch die Ressourcennutzung granular und einfach zu optimieren ist.
HINWEIS :Jedes untergeordnete Element erbt und wird durch die Limits eingeschränkt, die für die übergeordnete Kontrollgruppe festgelegt wurden.
Im obigen Diagramm können Sie sehen, dass es möglich ist, PID 1
zu haben im memory
, disk i/o
, und cpu
Kontrollgruppen. Die Cgroups werden pro Ressourcentyp erstellt und haben keine Verbindung zueinander. Das heißt, Sie könnten eine database
haben Gruppe, die allen Controllern zugeordnet ist, aber die Gruppen werden unabhängig voneinander behandelt. Wie GIDs wird diesen Gruppen bei der Erstellung ein numerischer Wert und kein Anzeigename zugewiesen. Unter der Haube verwendet der Kernel diese Werte, um die Ressourcenzuweisung zu bestimmen. Um es anders zu sehen, nehmen Sie an, dass jeder Cgroup-Name, sobald er mit einem Controller verbunden ist, in den Namen des Controllers plus den Namen Ihrer Wahl umbenannt wird. Also eine Gruppe namens database
im memory
controller kann eigentlich als memory-database
angesehen werden . Es besteht also kein Bezug zu einer database
Gruppe, die dem Controller cpu
zugeordnet ist da der freundliche Name als cpu-database
gedacht werden kann .
HINWEIS :Dies ist eine grobe Vereinfachung und technisch NICHT korrekt, falls Sie sich mit dem zugrunde liegenden Cgroup-Code befassen möchten. Die obige Erklärung dient dem besseren Verständnis.
Abschluss
Jetzt haben Sie also eine Vorstellung davon, was Cgroups sind und wie sie Ihnen bei der Leistungsoptimierung und Sicherheit helfen können. Sie haben auch ein besseres Verständnis dafür, wie Cgroups mit Controllern interagieren.
Dieser Artikel ist keine Aufschlüsselung aller Controller-Typen, die in Kontrollgruppen vorhanden sind. Etwas in dieser Größenordnung würde ein ganzes Buch brauchen, um es richtig zu erklären. Im nächsten Artikel betrachte ich CPUShares aufgrund ihrer relativen Komplexität und der Bedeutung, die sie für den Gesamtzustand eines Systems spielen. Die anderen Controller funktionieren ähnlich. Daher sollten Sie in der Lage sein, die Lehren aus dem CPU-Controller zu ziehen und sie auf die meisten verbleibenden Cgroup-Controller anzuwenden.
Vergessen Sie nicht, dass wir in Teil drei administrative Aufgaben untersuchen und in Teil vier abschließen, wie systemd mit cgroups interagiert.
[ Erste Schritte mit Containern? Schauen Sie sich diesen kostenlosen Kurs an. Containerisierte Anwendungen bereitstellen:Eine technische Übersicht. ]