So begrenzen Sie Ressourcen mit cgroups unter CentOS 6

Einführung

Control Groups oder cgroups ist eine Kernel-Funktion, die in CentOS 6 eingeführt wurde, um den Zugriff auf Systemressourcen für Prozesse auf eine neue Weise zu beschränken. Sie können Ihre eigenen cgroups erstellen, die von Ihnen konfigurierten cgroups überwachen, cgroups den Zugriff auf bestimmte Ressourcen verweigern und sogar Ihre cgroups dynamisch auf einem laufenden System neu konfigurieren.

In diesem Lernprogramm erfahren Sie, wie Sie die CPU-, Speicher- und Festplatten-E / A-Werte für Prozesse begrenzen. Zu diesem Zweck werden zunächst einige Kontrollgruppen erstellt, Prozesse hinzugefügt und deren Leistung überprüft.

Voraussetzungen

Bevor Sie mit diesem Lernprogramm beginnen, sollten Sie einen Benutzer ohne Rootberechtigung mit sudo-Setup auf Ihrem CentOS 6-Droplet haben. Befolgen Sie unsere Initial Server Setup with CentOS 6 Anleitung, um einen Benutzer dieses Typs einzurichten. Alle Befehle werden als dieser Benutzer ausgeführt.

Schritt 1 - Installation

In diesem Abschnitt installieren wir die Pakete, die erforderlich sind, damit cgroups funktioniert.

Kontrollgruppen und die Subsysteme, auf die sie sich beziehen, können mit Shell-Befehlen und Dienstprogrammen bearbeitet werden. Die einfachste Möglichkeit, mit cgroups zu arbeiten, ist die Installation des Pakets + libcgroup +. Das Paket + libcgroup + enthält Befehlszeilendienstprogramme, Konfigurationsdateien und Manpages für cgroups. Dieses Paket wird nicht standardmäßig auf einem CentOS 6-Server installiert. Führen Sie zum Installieren den folgenden Befehl aus:

sudo yum install libcgroup

Schritt 2 - Starten des Dienstes

Der Dienst + cgconfig + (Kontrollgruppenkonfiguration) wird zum Erstellen von Kontrollgruppen und zum Verwalten von Subsystemen verwendet. Es kann so konfiguriert werden, dass es zum Startzeitpunkt gestartet und die vordefinierten Gruppen wiederhergestellt werden. Dadurch bleiben sie auch nach einem Neustart erhalten. Der Dienst + cgconfig + wird unter CentOS 6 nicht standardmäßig gestartet. Lassen Sie uns ihn also starten:

sudo service cgconfig start

Durch das Starten des Dienstes "+ cgconfig " wird ein virtuelles Dateisystem erstellt, das unter " / cgroup +" mit allen Subsystemen eingebunden ist. Lassen Sie uns dies überprüfen:

sudo ls /cgroup

Dieser Befehl sollte die folgenden Subsysteme anzeigen:

blkio  cpu  cpuacct  cpuset  devices  freezer  memory  net_cls

Sie können auch den Befehl "lscgroup" ausführen, um Folgendes zu überprüfen:

sudo lscgroup

Sie sehen die Subsysteme in einem etwas anderen Layout:

cpuset:/
cpu:/
cpuacct:/
memory:/
devices:/
freezer:/
net_cls:/
blkio:/

Systemressourcen

Die Systemressourcen werden als Subsysteme bezeichnet, und jedes Subsystem verfügt über mehrere Parameter, denen wir Werte zuweisen können. CentOS 6 bietet zehn cgroup-Subsysteme:

  • * blkio * - Dieses Subsystem begrenzt den Ein- / Ausgabezugriff auf und von Blockgeräten wie physischen Laufwerken (Festplatte, Solid State, USB usw.).

  • * cpu * - Dieses Subsystem begrenzt die verfügbare CPU-Zeit

  • * cpuacct * - Dieses Subsystem generiert automatische Berichte zu CPU-Ressourcen, die von Tasks in einer C-Gruppe verwendet werden

  • * cpuset * - Dieses Subsystem weist einzelnen CPUs (auf einem Multicore-System) und Speicherknoten Aufgaben in einer C-Gruppe zu

  • * devices * - Dieses Subsystem erlaubt oder verweigert den Zugriff auf Geräte durch Aufgaben in einer cgroup

  • * freezer * - Dieses Subsystem setzt Aufgaben in einer Kontrollgruppe aus oder setzt sie fort

  • * memory * - Dieses Subsystem begrenzt die Speichernutzung für Aufgaben in einer C-Gruppe und generiert automatische Berichte über die von diesen Aufgaben verwendeten Speicherressourcen

  • * net_cls * - Dieses Subsystem kennzeichnet Netzwerkpakete mit einer Klassenkennung (classid), mit der der Linux-Datenverkehrs-Controller (tc) Pakete identifizieren kann, die von einer bestimmten cgroup-Task stammen

  • * net_prio * - Dieses Subsystem bietet die Möglichkeit, die Priorität des Netzwerkverkehrs pro Netzwerkschnittstelle dynamisch festzulegen

  • * ns * - Dies ist das Namespace-Subsystem

Schritt 3 - Konfiguration

In diesem Abschnitt erstellen wir Beispiel-Cgroups und legen einige Ressourcenlimits für diese Cgroups fest. Die Konfigurationsdatei für cgroup lautet + / etc / cgconfig.conf +. Abhängig vom Inhalt der Konfigurationsdatei kann cgconfig Hierarchien erstellen, erforderliche Dateisysteme bereitstellen, cgroups erstellen und Subsystemparameter (Ressourcenlimits) für jede cgroup festlegen.

Eine Hierarchie ist eine Gruppe von Gruppengruppen, die in einem Baum angeordnet sind, sodass sich jede Aufgabe im System in genau einer der Gruppengruppen in der Hierarchie befindet. In einer CentOS 6-Standardkonfiguration wird jedes Subsystem in eine eigene Hierarchie eingeordnet.

Erstellen wir zunächst einige Gruppen mit den Namen limitcpu, limitmem, limitio und browsers. Die Datei + / etc / cgconfig.conf enthält zwei Haupttypen von Einträgen:` + mount` und + group +. Zeilen, die mit + group + beginnen, erstellen cgroups und legen die Subsystemparameter fest. Bearbeiten Sie die Datei + / etc / cgconfig.conf + und fügen Sie die folgenden cgroup-Einträge am unteren Rand hinzu:

/etc/cgconfig.conf

group limitcpu{
       cpu {
               cpu.shares = 400;
       }
}

group limitmem{
       memory {
               memory.limit_in_bytes = 512m;
       }
}

group limitio{
       blkio {
               blkio.throttle.read_bps_device = "252:0         2097152";
       }
}

group browsers{
       cpu {
               cpu.shares = 200;
       }
       memory {
               memory.limit_in_bytes = 128m;
       }
}
  • In der Gruppe "+ limitcpu " begrenzen wir die CPU-Freigaben, die für Prozesse in dieser Gruppe verfügbar sind, auf 400. ` cpu.shares +` gibt den relativen Anteil der CPU-Zeit an, der für die Tasks in der cgroup verfügbar ist.

  • In der Cgroup "+ limitmem +" begrenzen wir den für die Cgroup-Prozesse verfügbaren Speicher auf 512 MB.

  • In der Gruppe "+ limitio +" begrenzen wir den Datenträgerlesedurchsatz auf 2 MB / s. Hier beschränken wir die Lese-E / A auf den primären Datenträger / dev / vda, wobei die Major: Minor-Zahl 252: 0 und 2 MB / s in Bytes pro Sekunde konvertiert werden (2x1024x1024 = 2097152).

  • In der Gruppe "+ browser +" begrenzen wir die Anzahl der CPU-Freigaben auf 200 und den verfügbaren Speicher auf 128 MB.

Wir müssen den Dienst "+ cgconfig " neu starten, damit die Änderungen in der Datei " / etc / cgconfig.conf +" wirksam werden:

sudo service cgconfig restart

Lassen Sie uns "+ cgconfig " aktivieren, um beim Systemstart zu starten. Wenn Sie den Dienst mit chkconfig aktivieren, liest er beim Booten die Konfigurationsdatei cgroup ` / etc / cgconfig.conf +`. cgroups werden von Sitzung zu Sitzung neu erstellt und bleiben persistent.

sudo chkconfig cgconfig on

Überprüfen Sie als Nächstes, ob die von uns konfigurierten Gruppen korrekt angezeigt werden:

lscgroup

Wenn alles gut gegangen ist, sollten Sie sehen:

cpuset:/
cpu:/
cpu:/browsers
cpu:/limitcpu
cpuacct:/
memory:/
memory:/browsers
memory:/limitmem
devices:/
freezer:/
net_cls:/
blkio:/
blkio:/limitio

Unser nächstes Ziel ist es, die Prozesse (Aufgaben), für die wir Ressourcen einschränken möchten, auf die zuvor erstellten Gruppen zu beschränken.

+ Cgred + (Control Group Rules Engine Daemon) ist ein Dienst, der Tasks gemäß den in der Datei + / etc / cgrules.conf + festgelegten Parametern in cgroups verschiebt. Einträge in der Datei + / etc / cgrules.conf + können eine der beiden folgenden Formen annehmen:

user subsystems control_group

or

user:command subsystems control_group

+ user + bezieht sich auf einen Benutzernamen oder einen Gruppennamen, dem das Zeichen "@" vorangestellt ist. + Subsysteme + beziehen sich auf eine durch Kommas getrennte Liste von Subsystemnamen. + control_group + repräsentiert einen Pfad zur cgroup und + command + steht für einen Prozessnamen oder einen vollständigen Befehlspfad eines Prozesses. Einträge in der Datei + / etc / cgrules.conf + können die folgenden zusätzlichen Notationen enthalten:

  • + @ + - zeigt eine Gruppe anstelle eines einzelnen Benutzers an. Zum Beispiel zeigt "+ @ admin +" alle Benutzer in der Admin-Gruppe an.

  • + * + - steht für "alle". Beispiel: "+ * +" im Benutzerfeld steht für alle Benutzer.

  • +% + - repräsentiert einen Artikel, der mit dem Artikel in der obigen Zeile identisch ist.

Fügen wir nun die Programme / Prozesse hinzu, die wir einschränken möchten. Bearbeiten Sie + / etc / cgrules.conf + und fügen Sie am Ende Folgendes hinzu:

/etc/cgrules.conf

*:firefox       cpu,memory      browsers/
*:hdparm        blkio   limitio/
sammy   blkio   limitio/
@admin:memhog  memory  limitmem/
*:cpuhog        cpu     limitcpu/

In den obigen Zeilen legen wir die folgenden Regeln fest:

  • * firefox * -Prozesse, die von jedem Benutzer ausgeführt werden, werden automatisch der Gruppe "+ browser +" hinzugefügt und sind auf CPU- und Speichersubsysteme beschränkt.

  • * hdparm * -Prozesse, die von einem Benutzer ausgeführt werden, werden der Gruppe "+ limitio +" hinzugefügt und im Subsystem "blkio" gemäß den in dieser Gruppe angegebenen Parameterwerten eingeschränkt.

  • Alle vom Benutzer * sammy * ausgeführten Prozesse werden zur Gruppe + limitio + c hinzugefügt und im Subsystem blkio eingeschränkt.

  • * memhog * -Prozesse, die von jemandem in der Gruppe "+ admin " ausgeführt werden, werden der Gruppe " limitmem +" hinzugefügt und im Speichersubsystem begrenzt.

  • * cpuhog * -Prozesse, die von einem beliebigen Benutzer ausgeführt werden, werden der cgroup "+ limitcpu +" hinzugefügt und im cpu-Subsystem eingeschränkt.

Wir müssen den "+ cgred +" - Dienst starten, damit die Änderungen an der Konfiguration von "cgrules" wirksam werden. Verwenden Sie dazu den folgenden Befehl:

sudo service cgred start

Wir müssen auch sicherstellen, dass der Dienst "+ cgred +" aktiviert ist, damit er beim Systemstart gestartet werden kann, damit unsere Regeln bei allen Neustarts beibehalten werden:

sudo chkconfig cgred on

Schritt 4 - Testen

In diesem Schritt überprüfen wir, ob das Datenträger-Lesedurchsatzlimit von 2 MB / s gemäß der in + cgrules.conf + hinzugefügten Regel korrekt durchgesetzt wird. Dazu installieren wir das Tool + hdparm + und führen es aus. Das + hdparm + Tool kann Hardwareparameter von Festplattenlaufwerken einstellen und anzeigen, Lese- und Schreibgeschwindigkeiten messen usw. Lassen Sie uns hdparm installieren mit:

sudo yum install hdparm

Lassen Sie uns nun einen Befehl ausführen, um die Lesegeschwindigkeit Ihrer Festplatte / dev / vda zu messen:

sudo hdparm --direct -t /dev/vda

Sie sollten die folgende Ausgabe sehen:

/dev/vda:
Timing O_DIRECT disk reads:   6 MB in  3.00 seconds =   2.00 MB/sec

Die Ausgabe zeigt einen Datenträgerlesedurchsatz von 2 MB / s. Wenn Sie die beiden Dienste "+ cgconfig " und " cgred " beenden und den obigen Befehl " hdparm +" erneut ausführen, können Sie die ursprüngliche / standardmäßige Lesegeschwindigkeit ab dem Zeitpunkt sehen, an dem die Regeln für cgroup nicht implementiert wurden.

Fazit

In diesem Tutorial werden nur einige grundlegende Funktionen vorgestellt, die Sie mit cgroups ausführen können. Es ist auch möglich, untergeordnete Gruppen zu erstellen, die Menge der von einer Gruppe verbrauchten Ressourcen zu zählen und zu melden, eine Gruppe von Prozessen mit dem Subsystem * freezer * anzuhalten und vieles mehr.

Weitere Informationen finden Sie in den folgenden Ressourcen: