Handbuch zur Ressourcenverwaltung
Verwaltung von Systemressourcen unter Red Hat Enterprise Linux 6
Ausgabe 1
Zusammenfassung
Kapitel 1. Einführung in Kontrollgruppen Link kopierenLink in die Zwischenablage kopiert!
cgconfig (»Kontrollgruppenkonfiguration «) kann so konfiguriert werden, dass er beim Systemstart automatisch startet und Ihre definierten Kontrollgruppen wieder einrichtet, wodurch die Kontrollgruppen über Neustarts hinweg also persistent sind.
1.1. Organisation von Kontrollgruppen Link kopierenLink in die Zwischenablage kopiert!
Das Linux-Prozessmodell
init-Prozess, der vom Kernel zum Zeitpunkt des Systemstarts gestartet wird und der andere Prozesse startet (welche wiederum eigene untergeordnete Prozesse starten können). Da alle Prozesse von einem einzigen, übergeordneten Prozess abstammen, handelt es sich beim Linux-Prozessmodell um eine einzige Hierarchie bzw. einen einzigen Baum.
init die Umgebungsvariablen (wie z.B. die PATH-Variable)[1] und andere bestimmte Attribute (wie z.B. offene Dateideskriptoren) von seinem übergeordneten Prozess.
Das Kontrollgruppenmodell
- Sie sind hierarchisch
- Untergeordnete Kontrollgruppen erben bestimmte Attribute ihrer übergeordneten Kontrollgruppe
Verfügbare Subsysteme in Red Hat Enterprise Linux
blkio— dieses Subsystem setzt Grenzen für Eingabe/Ausgabe-Zugriff auf Blockgeräte wie z.B. physische Laufwerke (Festplatten, Solid State Drives, USB, etc.).cpu— dieses Subsystem verwendet den Scheduler, um Kontrollgruppenaufgaben Zugriff auf die CPU zu gewähren.cpuacct— dieses Subsystem generiert automatische Berichte über CPU-Ressourcen, die von Aufgaben in einer Kontrollgruppe verwendet werden.cpuset— dieses Subsystem weist einzelne CPUs (auf einem System mit mehreren CPUs) und Speicherknoten zu Aufgaben in einer Kontrollgruppe zu.devices— dieses Subsystem erlaubt oder verwehrt den Zugriff auf Geräte für Aufgaben in einer Kontrollgruppe.freezer— dieses Subsystem pausiert Aufgaben in einer Kontrollgruppe oder setzt diese fort.memory— dieses Subsystem setzt Grenzwerte für den Speicherverbrauch durch Aufgaben in einer Kontrollgruppe und erstellt automatische Berichte zu Speicherressourcen, die von diesen Aufgaben verwendet werden.net_cls— dieses Subsystem markiert Netzwerkpakete mit einem Class-Identifier (classid), der es dem Linux-Traffic-Controller (tc) ermöglicht, Pakete zu identifizieren, die von einer bestimmten Kontrollgruppe stammen.ns— das Namensraum-Subsystem.
Anmerkung
1.2. Beziehungen zwischen Subsystemen, Hierarchien, Kontrollgruppen und Aufgaben Link kopierenLink in die Zwischenablage kopiert!
Jedes einzelne Subsystem (wie z.B. cpu) kann mit maximal einer Hierarchie verknüpft werden.
cpu-Subsystem nie mit zwei verschiedenen Hierarchien verknüpft werden.
Eine einzelne Hierarchie kann mit einem oder mehreren Subsystemen verknüpft sein.
cpu- und memory- Subsysteme (oder eine beliebige Anzahl an Subsystemen) mit einer einzelnen Hierarchie verknüpft werden, vorausgesetzt, dass keine von beiden mit einer anderen Hierarchie verknüpft ist.
Jedes Mal, wenn eine neue Hierarchie auf dem System erstellt wird, sind alle Aufgaben auf dem System anfangs Mitglieder der standardmäßigen Kontrollgruppe dieser Hierarchie, die auch Root-Kontrollgruppe genannt wird. Für jede einzelne von Ihnen erstellte Hierarchie gilt, dass jede Aufgabe auf dem System Mitglied von genau einer Kontrollgruppe in dieser Hierarchie sein kann. Eine einzelne Aufgabe kann in mehreren Kontrollgruppen sein, vorausgesetzt, diese Kontrollgruppen befinden sich in verschiedenen Hierarchien. Sobald eine Aufgabe zu einem Mitglied einer zweiten Kontrollgruppe in derselben Hierarchie gemacht wird, wird sie von der ersten Kontrollgruppe in dieser Hierarchie entfernt. Zu keinem Zeitpunkt kann eine Aufgabe Mitglied in zwei Kontrollgruppen in derselben Hierarchie sein.
cpu- und das memory-Subsystem mit einer Hierarchie namens cpu_and_mem verknüpft sind, und das net_cls-Subsystem mit einer Hierarchie namens net, dann könnte ein laufender httpd-Prozess ein Mitglied in einer Kontrollgruppe in cpu_and_mem und in einer Kontrollgruppe in net sein.
cpu_and_mem, in der der httpd-Prozess Mitglied ist, kann seine CPU-Zeit auf die Hälfte dessen setzen, was anderen Prozessen zugewiesen ist, und kann seinen Speicherverbrauch auf maximal 1024 MB begrenzen. Zusätzlich kann die Kontrollgruppe in net, in der er ebenfalls Mitglied ist, seine Übertragungsrate auf 30 Megabytes pro Sekunde begrenzen.
Jeder Prozess (Aufgabe) auf dem System, der sich selbst klont, erzeugt einen untergeordneten Prozess (Aufgabe). Der untergeordnete Prozess wird automatisch Mitglied all jener Kontrollgruppen, bei denen auch der übergeordnete Prozess Mitglied ist. Der untergeordnete Prozess kann anschließend bei Bedarf anderen Kontrollgruppen zugewiesen werden, anfänglich erbt er jedoch immer die Kontrollgruppen (in Prozessterminologie die "Umgebung") seines übergeordneten Prozesses.
httpd-Aufgabe ein Mitglied der Kontrollgruppe namens half_cpu_1gb_max in der cpu_and_mem-Hierarchie ist sowie ein Mitglied der Kontrollgruppe trans_rate_30 in der net-Hierarchie. Wenn der httpd-Prozess sich selbst klont, werden seine untergeordneten Prozesse demnach automatisch Mitglieder der half_cpu_1gb_max-Kontrollgruppe und der trans_rate_30-Kontrollgruppe. Sie erben genau dieselben Kontrollgruppen, denen auch ihr übergeordneter Prozess angehört.
1.3. Auswirkungen auf die Ressourcenverwaltung Link kopierenLink in die Zwischenablage kopiert!
- Da eine Aufgabe in jeder Hierarchie nur einer einzigen Kontrollgruppe zugewiesen sein kann, gibt es nur eine Art und Weise, auf die eine Aufgabe von einem Subsystem begrenzt oder beeinflusst wird. Dies Verhalten ist logisch - also ein Feature, kein Manko.
- Sie können mehrere Subsysteme zusammen gruppieren, so dass sie alle Aufgaben in einer einzelnen Hierarchie beeinflussen. Da Kontrollgruppen in dieser Hierarchie verschiedene Parameter gesetzt haben, werden diese Aufgaben unterschiedlich beeinflusst.
- Unter Umständen kann es manchmal nötig sein, eine Hierarchie zu refaktorieren (umzugestalten). Ein Beispiel hierfür ist das Entfernen eines Subsystems von einer Hierarchie, die mit mehreren Subsystemen verknüpft ist, um es anschließend mit einer neuen, separaten Hierarchie zu verknüpfen.
- Falls der Bedarf, Subsysteme unter separaten Hierarchien aufzuteilen, nicht mehr besteht, können Sie umgekehrt auch eine Hierarchie entfernen und deren Subsysteme einer vorhandenen Hierarchie zuordnen.
- Dieser Aufbau ermöglicht eine sehr einfache Implementierung von Kontrollgruppen, bei der z.B. einige wenige Parameter für bestimmte Aufgaben in einer einzelnen Hierarchie festgelegt werden, die z.B. nur mit den CPU- und Speichersubsystemen verknüpft ist.
- Dieser Aufbau ermöglicht jedoch auch sehr ausgefeilte Konfigurationen: Jede Aufgabe (Prozess) auf einem System kann ein Mitglied jeder Hierarchie sein, jede davon mit einem einzelnen Subsystem verknüpft. Solch eine Konfiguration gibt dem Systemadministrator vollständige Kontrolle über alle Parameter für jede einzelne Aufgabe.
Kapitel 2. Verwendung von Kontrollgruppen Link kopierenLink in die Zwischenablage kopiert!
Anmerkung
yum install libcgroup
~]# yum install libcgroup
2.1. Der cgconfig-Dienst Link kopierenLink in die Zwischenablage kopiert!
cgconfig-Dienst, der mit dem libcgroup-Paket installiert wird, bietet einen bequemen Weg zum Einrichten von Hierarchien, zum Verknüpfen von Subsystemen mit Hierarchien, und zum Verwalten von Kontrollgruppen innerhalb dieser Hierarchien. Wir empfehlen Ihnen, zur Verwaltung von Hierarchien und Kontrollgruppen auf Ihrem System cgconfig zu verwenden.
cgconfig-Dienst wird auf Red Hat Enterprise Linux 6 standardmäßig nicht automatisch gestartet. Wenn Sie den Dienst mit dem chkconfig-Befehl starten, liest er die Konfigurationsdatei der Kontrollgruppe, /etc/cgconfig.conf. Kontrollgruppen werden daher von Sitzung zu Sitzung neu erstellt und sind somit persistent. Abhängig vom Inhalt der Konfigurationsdatei kann cgconfig Hierarchien erstellen, benötigte Dateisysteme einhängen, Kontrollgruppen erstellen und Subsystemparameter für jede Gruppe setzen.
cgconfig.conf-Datei, die mit dem libcgroup-Paket installiert wird, erstellt eine separate Hierarchie für jedes Subsystem, hängt diese ein, und verknüpft diese Subsysteme mit diesen Hierarchien.
cgconfig-Dienst stoppen (mit dem Befehl service cgconfig stop), hängt er sämtliche Hierarchien, die er eingehängt hatte, wieder aus.
2.1.1. Die cgconfig.conf-Datei Link kopierenLink in die Zwischenablage kopiert!
cgconfig.conf-Datei beinhaltet zwei Haupttypen von Einträgen — mount und group. Mount-Einträge erstellen Hierarchien, hängen diese als virtuelle Dateisysteme ein und fügen Subsysteme zu diesen Hierarchien hinzu. Mount-Einträge werden unter Verwendung der folgenden Syntax definiert:
mount {
<controller> = <path>;
…
}
mount {
<controller> = <path>;
…
}
Beispiel 2.1. Erstellen eines Mount-Eintrags
cpuset-Subsystem:
mount {
cpuset = /cgroup/cpu;
}
mount {
cpuset = /cgroup/cpu;
}
mkdir /cgroup/cpu mount -t cgroup -o cpu cpu /cgroup/cpu
~]# mkdir /cgroup/cpu
~]# mount -t cgroup -o cpu cpu /cgroup/cpu
permissions-Abschnitt optional ist. Um Berechtigungen für einen Gruppeneintrag zu definieren, verwenden Sie die folgende Syntax:
Beispiel 2.2. Erstellen eines Gruppeneintrags
sqladmin zum Hinzufügen von Aufgaben zu der Kontrollgruppe, sowie den Benutzer root zum Modifizieren der Subsystemparameter.
mkdir -p /cgroup/cpu/daemons/sql chown root:root /cgroup/cpu/daemons/sql/* chown root:sqladmin /cgroup/cpu/daemons/sql/tasks echo 100 > /cgroup/cpu/daemons/sql/cpu.shares
~]# mkdir -p /cgroup/cpu/daemons/sql
~]# chown root:root /cgroup/cpu/daemons/sql/*
~]# chown root:sqladmin /cgroup/cpu/daemons/sql/tasks
~]# echo 100 > /cgroup/cpu/daemons/sql/cpu.shares
Anmerkung
cgconfig-Dienst neu starten, damit die Änderungen in der /etc/cgconfig.conf-Datei wirksam werden:
service cgconfig restart
~]# service cgconfig restart
/etc/cgconfig.conf gespeichert. Das Rautenzeichen ('#') am Anfang einer Zeile kommentiert diese Zeile aus und macht sie dadurch für den cgconfig-Dienst unsichtbar.
2.2. Erstellen einer Hierarchie und Verknüpfen von Subsystemen Link kopierenLink in die Zwischenablage kopiert!
Warnung
cgconfig-Dienst), werden diese Befehle fehlschlagen, wenn Sie nicht zunächst vorhandene Hierarchien aushängen - was sich jedoch auf den Betrieb des Systems auswirkt. Experimentieren Sie mit diesen Anweisungen nicht auf Produktionssystemen.
mount-Abschnitt der /etc/cgconfig.conf-Datei als Root. Einträge im mount-Abschnitt haben das folgende Format:
subsystem = /cgroup/hierarchy;
subsystem = /cgroup/hierarchy;
cgconfig wird es die Hierarchie erstellen und die Subsysteme damit verknüpfen.
cpu_and_mem und verknüpft die cpu, cpuset, cpuacct und memory Subsysteme damit.
Alternative Methode
mkdir /cgroup/name
~]# mkdir /cgroup/name
mkdir /cgroup/cpu_and_mem
~]# mkdir /cgroup/cpu_and_mem
mount-Befehl, um die Hierarchie einzuhängen und gleichzeitig ein oder mehrere Subsysteme einzuhängen. Zum Beispiel:
mount -t cgroup -o subsystems name /cgroup/name
~]# mount -t cgroup -o subsystems name /cgroup/name
Beispiel 2.3. Verwendung des mount-Befehls zum Verknüpfen mit Subsystemen
/cgroup/cpu_and_mem, das als Einhängepunkt für die Hierarchie dienen wird, die wir erstellen. Wir werden die Subsysteme cpu, cpuset und memory mit einer Hierarchie verknüpfen, die wir cpu_and_mem nennen, und mit dem mount-Befehl die cpu_and_mem-Hierarchie unter /cgroup/cpu_and_mem einhängen:
mount -t cgroup -o cpu,cpuset,memory cpu_and_mem /cgroup/cpu_and_mem
~]# mount -t cgroup -o cpu,cpuset,memory cpu_and_mem /cgroup/cpu_and_mem
lssubsys-Befehls [3] einsehen :
- Die
cpu,cpusetundmemorySubsysteme sind mit einer Hierarchie verknüpft, die unter/cgroup/cpu_and_memeingehängt ist - Die
net_cls,ns,cpuacct,devices,freezerundblkioSubsysteme sind bislang mit keiner Hierarchie verknüpft, wie das Fehlen eines Einhängepunktes zeigt.
2.3. Verknüpfen und Entfernen von Subsystemen mit/von einer vorhandenen Hierarchie Link kopierenLink in die Zwischenablage kopiert!
mount-Abschnitt der /etc/cgconfig.conf-Datei, und verwenden Sie dabei dieselbe Syntax wie in Abschnitt 2.2, »Erstellen einer Hierarchie und Verknüpfen von Subsystemen« beschrieben. Beim nächsten Start von cgconfig wird es die Subsysteme je nach spezifizierten Hierarchien erkennen.
Alternative Methode
mount-Befehl an, zusammen mit der remount-Option.
Beispiel 2.4. Neu Einhängen einer Hierarchie zum Hinzufügen eines Subsystems
lssubsys-Befehl zeigt die cpu, cpuset und memory Subsysteme verknüpft mit der cpu_and_mem-Hierarchie:
cpu_and_mem-Hierarchie neu ein. Verwenden Sie dazu die remount-Option und geben Sie cpuacct in der Liste der Subsysteme an:
mount -t cgroup -o remount,cpu,cpuset,cpuacct,memory cpu_and_mem /cgroup/cpu_and_mem
~]# mount -t cgroup -o remount,cpu,cpuset,cpuacct,memory cpu_and_mem /cgroup/cpu_and_mem
lssubsys-Befehl zeigt nun cpuacct verknüpft mit der cpu_and_mem-Hierarchie:
cpuacct-Subsystem zu entfernen, lassen Sie es beim Einhängen einfach weg:
mount -t cgroup -o remount,cpu,cpuset,memory cpu_and_mem /cgroup/cpu_and_mem
~]# mount -t cgroup -o remount,cpu,cpuset,memory cpu_and_mem /cgroup/cpu_and_mem
2.4. Aushängen einer Hierarchie Link kopierenLink in die Zwischenablage kopiert!
umount-Befehls:
umount /cgroup/name
~]# umount /cgroup/name
umount /cgroup/cpu_and_mem
~]# umount /cgroup/cpu_and_mem
cgclear-Befehl, mithilfe dessen Sie eine Hierarchie deaktivieren können, selbst wenn diese nicht leer ist — siehe Abschnitt 2.11, »Entladen von Kontrollgruppen «.
2.5. Erstellen von Kontrollgruppen Link kopierenLink in die Zwischenablage kopiert!
cgcreate-Befehl, um Kontrollgruppen zu erstellen. Die Syntax für cgcreate lautet wie folgt: cgcreate -t uid:gid -a uid:gid -g subsystems:path , wobei gilt:
-t(optional) — definiert einen Benutzer (durch die Benutzer-ID, uid), der Besitzer dertasks-Pseudodatei für diese Kontrollgruppe sein soll. Der Benutzer kann Aufgaben zur Kontrollgruppe hinzufügen.Anmerkung
Beachten Sie, dass der einzige Weg zum Entfernen einer Aufgabe aus einer Kontrollgruppe darin besteht, diese Aufgabe in eine andere Kontrollgruppe zu verlegen. Um eine Aufgabe zu verlegen, muss der Benutzer über Schreibzugriff auf die Ziel-Kontrollgruppe verfügen. Schreibzugriff auf die Quell-Kontrollgruppe ist dagegen unerheblich.-a(optional) — definiert einen Benutzer (durch die Benutzer-ID, uid) und eine Gruppe (durch die Gruppen-ID, gid), der bzw. die Besitzer aller Pseudodateien außertasksfür diese Kontrollgruppe sein soll. Dieser Benutzer kann den Zugriff, den Prozesse in dieser Kontrollgruppe auf Systemressourcen besitzen, ändern.-g— spezifiziert die Hierarchie, in der die Kontrollgruppe erstellt werden soll, als eine kommagetrennte Liste von subsystems (Subsystemen), die mit diesen Hierarchien verknüpft sind. Falls sich die Subsysteme in dieser Liste in verschiedenen Hierarchien befinden, wird die Gruppe in jeder dieser Hierarchien erstellt. Der Liste der Hierarchien folgt ein Doppelpunkt und der path (Pfad) zur untergeordneten Gruppe relativ zur Hierarchie. Der Pfad darf nicht den Einhängepunkt der Hierarchie enthalten.Beispielsweise heißt die Kontrollgruppe im Verzeichnis/cgroup/cpu_and_mem/lab1/schlichtlab1— ihr Pfad ist bereit eindeutig bestimmt, da es maximal eine Hierarchie für jedes Subsystem gibt. Beachten Sie zudem, dass die Gruppe von allen Subsystemen gesteuert wird, die in den Hierarchien existieren, in der die Kontrollgruppe erstellt wird, obwohl diese Subsysteme nicht imcgcreate-Befehl angegeben wurden — siehe Beispiel 2.5, »cgcreate-Verwendung«.
Beispiel 2.5. cgcreate-Verwendung
cpu und memory Subsysteme zusammen unter der cpu_and_mem-Hierarchie eingehängt sind und der net_cls-Controller unter einer separaten Hierarchie namens net. Führen wir nun Folgendes aus:
cgcreate -g cpu,net_cls:/test-subgroup
~]# cgcreate -g cpu,net_cls:/test-subgroup
cgcreate-Befehl erstellt zwei Gruppen namens test-subgroup, eine in der cpu_and_mem-Hierarchie und eine in der net-Hierarchie. Die test-subgroup-Gruppe in der cpu_and_mem-Hierarchie wird gesteuert vom memory-Subsystem, obwohl wir dies nicht im cgcreate-Befehl angegeben haben.
Alternative Methode
mkdir:
mkdir /cgroup/hierarchy/name/child_name
~]# mkdir /cgroup/hierarchy/name/child_name
mkdir /cgroup/cpuset/lab1/group1
~]# mkdir /cgroup/cpuset/lab1/group1
2.6. Entfernen von Kontrollgruppen Link kopierenLink in die Zwischenablage kopiert!
cgdelete-Befehl, der eine ähnliche Syntax wie der cgcreate-Befehl hat. Führen Sie Folgendes aus: cgdelete subsystems:path, wobei gilt:
- subsystems ist eine kommagetrennte Liste von Subsystemen.
- path ist der Pfad zur Kontrollgruppe relativ zum Root der Hierarchie.
cgdelete cpu,net_cls:/test-subgroup
~]# cgdelete cpu,net_cls:/test-subgroup
cgdelete kann mit der Option -r auch rekursiv alle Untergruppen entfernen.
2.7. Einstellen von Parametern Link kopierenLink in die Zwischenablage kopiert!
cgset-Befehl von einem Benutzerkonto ausführen, das über die Berechtigungen zur Änderung der relevanten Gruppe verfügt. Falls beispielsweise /cgroup/cpuset/group1 existiert, spezifizieren Sie mit dem folgenden Befehl die CPUs, auf die diese Gruppe Zugriff hat:
cpuset]# cgset -r cpuset.cpus=0-1 group1
cpuset]# cgset -r cpuset.cpus=0-1 group1
cgset lautet: cgset -r parameter=value path_to_cgroup , wobei gilt:
- parameter ist der zu setzende Parameter, welcher der Datei im Verzeichnis der jeweiligen Kontrollgruppe entspricht
- value ist der Wert des Parameters
- path_to_cgroup ist der Pfad zur Kontrollgruppe relativ zum Root der Hierarchie. Um beispielsweise den Parameter der Root-Gruppe zu setzen (falls
/cgroup/cpuacct/existiert), führen Sie Folgendes aus:cpuacct]# cgset -r cpuacct.usage=0 /
cpuacct]# cgset -r cpuacct.usage=0 /Copy to Clipboard Copied! Toggle word wrap Toggle overflow Alternativ können Sie auch Folgendes ausführen, da.relativ zur Root-Gruppe ist (d.h. die Root-Gruppe selbst):cpuacct]# cgset -r cpuacct.usage=0 .
cpuacct]# cgset -r cpuacct.usage=0 .Copy to Clipboard Copied! Toggle word wrap Toggle overflow Beachten Sie jedoch, dass/die bevorzugte Syntax ist.Anmerkung
Nur eine kleine Anzahl von Parametern können für die Root-Gruppe gesetzt werden (wie z.B. dercpuacct.usage-Parameter, der in den obigen Beispielen gezeigt wurde). Da der Root-Gruppe sämtliche verfügbaren Ressourcen gehören, wäre es sinnlos, alle vorhandenen Prozesse zu begrenzen, indem bestimmte Parameter wie z.B. dercpuset.cpu-Parameter definiert werden.Um den Parameter vongroup1einzustellen, die eine Untergruppe der Root-Gruppe ist, führen Sie Folgendes aus:cpuacct]# cgset -r cpuacct.usage=0 group1
cpuacct]# cgset -r cpuacct.usage=0 group1Copy to Clipboard Copied! Toggle word wrap Toggle overflow Der nachgestellte Schrägstrich am Ende des Gruppennamens (z.B.cpuacct.usage=0 group1/) ist optional.
cgset einstellen können, hängen ggf. von den Werten ab, die an höherer Stelle in der Hierarchie eingestellt wurden. Falls beispielsweise group1 ausschließlich CPU 0 auf einem System verwenden darf, können Sie group1/subgroup1 nicht zur Verwendung von CPUs 0 und 1 oder zur ausschließlichen Verwendung von CPU 1 einstellen.
cgset verwenden, um die Parameter aus einer Kontrollgruppe in eine andere, vorhandene Kontrollgruppe zu kopieren. Zum Beispiel:
cgset --copy-from group1/ group2/
~]# cgset --copy-from group1/ group2/
cgset lautet: cgset --copy-from path_to_source_cgroup path_to_target_cgroup, wobei gilt:
- path_to_source_cgroup ist der Pfad zur Kontrollgruppe, deren Parameter kopiert werden sollen, relativ zur Root-Gruppe der Hierarchie
- path_to_target_cgroup ist der Pfad zur Ziel-Kontrollgruppe, relativ zur Root-Gruppe der Hierarchie
Alternative Methode
echo-Befehls ein. Der folgende Befehl fügt beispielsweise den Wert 0-1 in die Pseudodatei cpuset.cpus der Kontrollgruppe group1 ein:
echo 0-1 > /cgroup/cpuset/group1/cpuset.cpus
~]# echo 0-1 > /cgroup/cpuset/group1/cpuset.cpus
2.8. Verschieben eines Prozesses in eine Kontrollgruppe Link kopierenLink in die Zwischenablage kopiert!
cgclassify ausführen:
cgclassify -g cpu,memory:group1 1701
~]# cgclassify -g cpu,memory:group1 1701
cgclassify lautet: cgclassify -g subsystems:path_to_cgroup pidlist, wobei gilt:
- subsystems ist eine kommagetrennte Liste mit Subsystemen, oder
*, zum Starten der Prozesse in den Hierarchien, die mit allen verfügbaren Subsystemen verknüpft sind. Falls Kontrollgruppen desselben Namens in mehreren Hierarchien existieren, beachten Sie, dass die-gOption die Prozesse in jeder dieser Gruppen verlegt. Vergewissern Sie sich, dass die Kontrollgruppe innerhalb aller Hierarchien existiert, deren Subsysteme Sie hier spezifizieren. - path_to_cgroup ist der Pfad zur Kontrollgruppe innerhalb ihrer Hierarchien
- pidlist ist eine kommagetrennte Liste von Process Identifier (PIDs)
-- sticky vor der Prozess-ID pid einfügen, um jegliche untergeordnete Prozesse in derselben Kontrollgruppe beizubehalten. Wenn Sie diese Option nicht setzen und der cgred-Daemon ausgeführt wird, werden untergeordnete Prozesse Kontrollgruppen anhand der in /etc/cgrules.conf gefundenen Einstellungen zugewiesen. Der Prozess selbst jedoch bleibt in der Kontrollgruppe, in der er gestartet wurde.
cgclassify können Sie mehrere Prozesse gleichzeitig verschieben. Dieser Befehl verschiebt beispielsweise die Prozesse mit den PIDs 1701 und 1138 in die Kontrollgruppe group1/:
cgclassify -g cpu,memory:group1 1701 1138
~]# cgclassify -g cpu,memory:group1 1701 1138
Alternative Methode
tasks-Datei einer Kontrollgruppe, um einen Prozess direkt in diese Kontrollgruppe zu verschieben. Um beispielsweise einen Prozess mit der PID 1701 in eine Kontrollgruppe unter /cgroup/lab1/group1/ zu verschieben:
echo 1701 > /cgroup/lab1/group1/tasks
~]# echo 1701 > /cgroup/lab1/group1/tasks
2.8.1. Der cgred-Daemon Link kopierenLink in die Zwischenablage kopiert!
/etc/cgrules.conf gesetzten Parameter in Kontrollgruppen verschiebt. Einträge in der /etc/cgrules.conf-Datei können in einer der folgenden zwei Formate vorliegen:
- user hierarchies control_group
- user:command hierarchies control_group
maria devices /usergroup/staff
maria devices /usergroup/staff
maria gehören, auf das devices-Subsystem anhand der in der Kontrollgruppe /usergroup/staff spezifizierten Parameter zugreifen. Um bestimmte Befehle mit bestimmten Kontrollgruppen zu verknüpfen, fügen Sie den Parameter command wie folgt hinzu:
maria:ftp devices /usergroup/staff/ftp
maria:ftp devices /usergroup/staff/ftp
maria den ftp-Befehl verwendet, der Prozess automatisch in die /usergroup/staff/ftp-Kontrollgruppe in der Hierarchie verlegt wird, die das devices-Subsystem enthält. Beachten Sie jedoch, dass der Daemon den Prozess erst in die Kontrollgruppe verlegt, nachdem die entsprechende Bedingung erfüllt wurde. Deshalb ist es möglich, dass der ftp-Prozess für kurze Zeit in der falschen Gruppe läuft. Falls der Prozess sofort Unterprozesse startet, während er sich noch in der falschen Gruppe befindet, werden diese Unterprozesse unter Umständen nicht verschoben.
/etc/cgrules.conf-Datei können die folgende, zusätzliche Notation enthalten:
@— wird dies als Präfix für user verwendet, kennzeichnet dies eine Gruppe statt eines einzelnen Benutzers. So sind@adminsbeispielsweise alle Benutzer in der Gruppeadmins.*— steht für "alle". So steht*im Feldsubsystembeispielsweise für alle Subsysteme.%— steht für ein Element, das dem Element in der darüber liegenden Zeile entspricht. Zum Beispiel:@adminstaff devices /admingroup @labstaff % %
@adminstaff devices /admingroup @labstaff % %Copy to Clipboard Copied! Toggle word wrap Toggle overflow
2.9. Starten eines Prozesses in einer Kontrollgruppe Link kopierenLink in die Zwischenablage kopiert!
Wichtig
cpuset-Subsystem verwendet, müssen die Parameter cpuset.cpus und cpuset.mems definiert sein.
cgexec-Befehl ausführen. Dieser Befehl startet beispielsweise den lynx-Webbrowser innerhalb der group1-Kontrollgruppe unter Berücksichtigung der Beschränkungen, die das cpu-Subsystem dieser Gruppe auferlegt:
cgexec -g cpu:group1 lynx http://www.redhat.com
~]# cgexec -g cpu:group1 lynx http://www.redhat.com
cgexec lautet: cgexec -g subsystems:path_to_cgroup command arguments , wobei gilt:
- subsystems ist eine kommagetrennte Liste mit Subsystemen, oder
*, zum Starten der Prozesse in den Hierarchien, die mit allen verfügbaren Subsystemen verknüpft sind. Falls Kontrollgruppen desselben Namens in mehreren Hierarchien existieren, beachten Sie (wie bereits beimcgset-Befehl in Abschnitt 2.7, »Einstellen von Parametern« beschrieben), dass die-gOption die Prozesse in jeder dieser Gruppen erstellt. Vergewissern Sie sich, dass die Kontrollgruppe innerhalb aller Hierarchien existiert, deren Subsysteme Sie hier spezifizieren. - path_to_cgroup ist der Pfad zu der Kontrollgruppe relativ zur Hierarchie.
- command ist der auszuführende Befehl
- arguments sind etwaige Parameter für den Befehl
-- sticky vor command einfügen, um jegliche untergeordneten Prozesse in derselben Kontrollgruppe zu halten. Wenn Sie diese Option nicht setzen und der cgred-Daemon ausgeführt wird, werden untergeordnete Prozesse anhand der in /etc/cgrules.conf gefundenen Einstellungen den Kontrollgruppen zugewiesen. Der Prozess selbst jedoch bleibt in der Kontrollgruppe, in der er gestartet wurde.
Alternative Methode
echo $$ > /cgroup/lab1/group1/tasks lynx
~]# echo $$ > /cgroup/lab1/group1/tasks
lynx
group1-Kontrollgruppe befindet. Ein noch besseres Vorgehen ist deshalb:
sh -c "echo \$$ > /cgroup/lab1/group1/tasks && lynx"
~]# sh -c "echo \$$ > /cgroup/lab1/group1/tasks && lynx"
2.9.1. Starten eines Dienstes in einer Kontrollgruppe Link kopierenLink in die Zwischenablage kopiert!
- sie müssen eine
/etc/sysconfig/servicename-Datei verwenden - sie müssen die
daemon()-Funktion von/etc/init.d/functionsverwenden, um den Dienst zu starten
/etc/sysconfig-Verzeichnis einen Eintrag in der Form CGROUP_DAEMON="subsystem:control_group" ein, wobei subsystem ein mit einer bestimmten Hierarchie verknüpftes Subsystem und control_group eine Kontrollgruppe in dieser Hierarchie ist. Zum Beispiel:
CGROUP_DAEMON="cpuset:daemons/sql"
CGROUP_DAEMON="cpuset:daemons/sql"
2.10. Abrufen von Informationen zu Kontrollgruppen Link kopierenLink in die Zwischenablage kopiert!
2.10.1. Suchen von Prozessen Link kopierenLink in die Zwischenablage kopiert!
ps -O cgroup
~]$ ps -O cgroup
cat /proc/PID/cgroup
~]$ cat /proc/PID/cgroup
2.10.2. Suchen von Subsystemen Link kopierenLink in die Zwischenablage kopiert!
cat /proc/cgroups
~]$ cat /proc/cgroups
lssubsys -m subsystems
~]$ lssubsys -m subsystems
lssubsys -m-Befehl nur den Einhängepunkt der obersten Ebene für jede Hierarchie ausgibt.
2.10.3. Suchen von Hierarchien Link kopierenLink in die Zwischenablage kopiert!
/cgroup einzuhängen. Ist dies auf Ihrem System der Fall, sehen Sie sich einfach den Inhalt dieses Verzeichnisses an, um eine Liste der Hierarchien zu erhalten. Falls tree auf Ihrem System installiert ist, führen Sie es aus, um einen Überblick über alle Hierarchien und der darin enthaltenen Kontrollgruppen zu erhalten:
tree /cgroup/
~]$ tree /cgroup/
2.10.4. Suchen von Kontrollgruppen Link kopierenLink in die Zwischenablage kopiert!
lscgroup
~]$ lscgroup
controller:path angeben. Zum Beispiel:
lscgroup cpuset:adminusers
~]$ lscgroup cpuset:adminusers
adminusers-Kontrollgruppe in der Hierarchie auf, mit der das cpuset-Subsystem verknüpft ist.
2.10.5. Anzeigen der Parameter von Kontrollgruppen Link kopierenLink in die Zwischenablage kopiert!
cgget -r parameter list_of_cgroups
~]$ cgget -r parameter list_of_cgroups
cgget -r cpuset.cpus -r memory.limit_in_bytes lab1 lab2
~]$ cgget -r cpuset.cpus -r memory.limit_in_bytes lab1 lab2
cpuset.cpus und memory.limit_in_bytes für die Kontrollgruppen lab1 und lab2.
cgget -g cpuset /
~]$ cgget -g cpuset /
2.11. Entladen von Kontrollgruppen Link kopierenLink in die Zwischenablage kopiert!
Warnung
cgclear zerstört alle Kontrollgruppen in allen Hierarchien. Falls Sie diese Hierarchien nicht in einer Konfigurationsdatei gespeichert haben, wird es schwierig sein, sie zu rekonstruieren.
cgclear, um ein vollständiges Kontrollgruppendateisystem zu entfernen.
Anmerkung
mount-Befehl zum Erstellen von Kontrollgruppen verwenden (anstelle des cgconfig-Dienstes), wird ein Eintrag in der /etc/mtab-Datei erstellt (die Tabelle der eingehängten Dateisysteme). Diese Änderung erfolgt ebenso in der /proc/mounts-Datei. Wenn jedoch Kontrollgruppen mit dem cgclear-Befehl und anderen cgconfig-Befehlen entladen werden, wird eine direkte Kernel-Schnittstelle verwendet, welche die Änderungen nicht in die /etc/mtab-Datei überträgt, sondern die neuen Informationen nur in die /proc/mounts-Datei schreibt. Aus diesem Grund sind die ausgehängten Kontrollgruppen nach dem Entladen durch den cgclear-Befehl unter Umständen nach wie vor in der /etc/mtab-Datei sichtbar und werden deshalb auch noch beim Ausführen des mount-Befehls angezeigt. In diesen Fällen ist es empfehlenswert, sich für eine genaue Aufstellung aller eingehängten Kontrollgruppen auf die /proc/mounts-Datei zu beziehen.
2.12. Weitere Informationsquellen Link kopierenLink in die Zwischenablage kopiert!
Die libcgroup-Handbuchseiten
man 1 cgclassify— dercgclassify-Befehl wird verwendet, um laufende Aufgaben auf eine oder mehrere Kontrollgruppen zu verlegen.man 1 cgclear— dercgclear-Befehl wird verwendet, um alle Kontrollgruppen in einer Hierarchie zu löschen.man 5 cgconfig.conf— Kontrollgruppen werden in dercgconfig.conf-Datei definiert.man 8 cgconfigparser— dercgconfigparser-Befehl analysiert diecgconfig.conf-Datei und hängt Hierarchien ein.man 1 cgcreate— dercgcreate-Befehl erstellt neue Kontrollgruppen in Hierarchien.man 1 cgdelete— dercgdelete-Befehl entfernt die angegebenen Kontrollgruppen.man 1 cgexec— dercgexec-Befehl führt Aufgaben in den angegebenen Kontrollgruppen aus.man 1 cgget— dercgget-Befehl zeigt Kontrollgruppenparameter an.man 5 cgred.conf—cgred.confist die Konfigurationsdatei für dencgred-Dienst.man 5 cgrules.conf—cgrules.confenthält die Regeln, anhand derer bestimmt wird, wann Aufgaben zu bestimmten Kontrollgruppen gehören.man 8 cgrulesengd— dercgrulesengd-Dienst verteilt Aufgaben auf Kontrollgruppen.man 1 cgset— dercgset-Befehl setzt Parameter für eine Kontrollgruppe.man 1 lscgroup— derlscgroup-Befehl listet die Kontrollgruppen in einer Hierarchie auf.man 1 lssubsys— derlssubsys-Befehl listet die Hierarchien auf, die die angegebenen Subsysteme enthalten.
lssubsys-Befehl ist Teil der Hilfsprogramme, die vom libcgroup-Paket bereitgestellt werden. Sie müssen libcgroup installieren, um ihn verwenden zu können: Siehe Kapitel 2, Verwendung von Kontrollgruppen, falls Sie lssubsys nicht ausführen können.
Kapitel 3. Subsysteme und anpassbare Parameter Link kopierenLink in die Zwischenablage kopiert!
cgroups.txt in der Kernel-Dokumentation dokumentiert, die auf Ihrem System unter /usr/share/doc/kernel-doc-kernel-version/Documentation/cgroups/ installiert ist (geliefert vom kernel-doc-Paket). Die neueste Version der Kontrollgruppendokumentation steht zudem online unter http://www.kernel.org/doc/Documentation/cgroups/cgroups.txt zur Verfügung. Beachten Sie jedoch, dass sich die in der aktuellsten Dokumentation genannten Features unter Umständen von jenen unterscheiden, die in dem Kernel auf Ihrem System zur Verfügung stehen.
cpuset.cpus beispielsweise eine Pseudodatei, die definiert, auf welche CPUs eine Kontrollgruppe zugreifen darf. Angenommen, /cgroup/cpuset/webserver ist eine Kontrollgruppe für den Webserver, der auf einem System läuft, und wir führen den folgenden Befehl aus:
echo 0,2 > /cgroup/cpuset/webserver/cpuset.cpus
~]# echo 0,2 > /cgroup/cpuset/webserver/cpuset.cpus
0,2 wird dadurch in die cpuset.cpus-Pseudodatei geschrieben und schränkt daher jegliche Aufgaben, deren PIDs in /cgroup/cpuset/webserver/tasks aufgeführt sind, so ein, dass nur CPU 0 und CPU 2 auf dem System verwendet werden dürfen.
3.1. blkio Link kopierenLink in die Zwischenablage kopiert!
blkio) überwacht und steuert den I/O-Zugriff auf Blockgeräte von Aufgaben in Kontrollgruppen. Werden in einige dieser Pseudodateien Werte geschrieben, schränkt dies den Zugriff oder die Bandbreite ein; werden von einigen dieser Pseudodateien Werte gelesen, liefert dies Informationen über I/O-Operationen.
- blkio.weight
- spezifiziert den relativen Anteil (das Gewicht) von Block I/O-Zugriff, der einer Kontrollgruppe standardmäßig zur Verfügung steht, im Bereich
100bis1000. Dieser Wert wird für bestimmte Geräte durch denblkio.weight_device-Parameter außer Kraft gesetzt. Um einer Kontrollgruppe beispielsweise ein standardmäßiges Gewicht von500für den Zugriff auf Blockgeräte zuzuweisen, führen Sie Folgendes aus:echo 500 > blkio.weight
echo 500 > blkio.weightCopy to Clipboard Copied! Toggle word wrap Toggle overflow - blkio.weight_device
- spezifiziert den relativen Anteil (das Gewicht) von Block I/O-Zugriff, der einer Kontrollgruppe standardmäßig für bestimmte Geräte zur Verfügung steht, im Bereich
100bis1000. Der Wert dieses Parameters setzt den Wert desblkio.weight-Parameters für die angegebenen Geräte außer Kraft. Werte werden im Format major:minor weight angegeben, wobei major und minor die in Linux Allocated Devices (auch Linux-Geräteliste genannt, verfügbar unter http://www.kernel.org/doc/Documentation/devices.txt) spezifizierten Gerätetypen und Knotennummern sind. Um einer Kontrollgruppe beispielsweise ein Gewicht von500für den Zugriff auf/dev/sdazuzuweisen, führen Sie Folgendes aus:echo 8:0 500 > blkio.weight_device
echo 8:0 500 > blkio.weight_deviceCopy to Clipboard Copied! Toggle word wrap Toggle overflow In der Linux Allocated Devices Notation steht8:0für/dev/sda. - blkio.time
- zeigt die Zeit an, die eine Kontrollgruppe I/O-Zugriff auf bestimmte Geräte hatte. Jeder Eintrag umfasst drei Felder: major, minor und time. major und minor sind die Gerätetypen und Knotennummern, die in den Linux Allocated Devices definiert sind. time ist die Zeitspanne in Millisekunden (ms).
- blkio.sectors
- zeigt die Anzahl an Sektoren an, die auf bestimmte Geräte bzw. von bestimmten Geräten durch eine Kontrollgruppe übertragen wurden. Jeder Eintrag umfasst drei Felder: major, minor und sectors. major und minor sind die Gerätetypen und Knotennummern, die in den Linux Allocated Devices definiert sind. sectors ist die Anzahl der Plattensektoren.
- blkio.io_service_bytes
- zeigt die Anzahl an Bytes an, die auf bestimmte Geräte bzw. von bestimmten Geräten durch eine Kontrollgruppe übertragen wurden. Jeder Eintrag umfasst vier Felder: major, minor, operation und bytes. major und minor sind die Gerätetypen und Knotennummern, die in den Linux Allocated Devices definiert sind. operation steht für die Art der Operation (
read,write,syncoderasync) und bytes ist die Anzahl der übertragenen Bytes. - blkio.io_serviced
- zeigt die Anzahl an I/O-Operationen an, die auf bestimmten Geräten von einer Kontrollgruppe durchgeführt wurden. Jeder Eintrag umfasst vier Felder: major, minor, operation und number. major und minor sind die Gerätetypen und Knotennummern, die in den Linux Allocated Devices definiert sind. operation steht für die Art der Operation (
read,write,syncoderasync) und number ist die Anzahl der Operationen. - blkio.io_service_time
- zeigt die Zeitspanne zwischen der Absendung einer Anfrage und deren Abschluss bei I/O-Operationen an, die auf bestimmten Geräten von einer Kontrollgruppe durchgeführt wurden. Jeder Eintrag umfasst vier Felder: major, minor, operation und time. major und minor sind die Gerätetypen und Knotennummern, die in den Linux Allocated Devices definiert sind. operation steht für die Art der Operation (
read,write,syncoderasync) und time ist die Zeitspanne in Nanosekunden (ns). Die Zeit wird in Nanosekunden angegeben statt in größeren Einheiten, damit dieser Bericht auch für Solid-State-Geräte aussagekräftig ist. - blkio.io_wait_time
- zeigt die Zeitspanne an, die I/O-Operationen auf bestimmten Geräten von Kontrollgruppen auf den Service der Scheduler-Queues warten. Wenn Sie diesen Bericht interpretieren, beachten Sie Folgendes:
- Die ausgewiesene Zeit kann größer sein als die Zeit, die insgesamt vergangen ist, da die ausgewiesene Zeit die kumulierte Zeit aller I/O-Operationen für die Kontrollgruppe darstellt, nicht die Zeit, die die Kontrollgruppe selbst auf I/O-Operationen gewartet hat. Um die Zeit herauszufinden, die die Gruppe als Ganzes gewartet hat, verwenden Sie
blkio.group_wait_time. - Falls das Gerät eine
queue_depth> 1 hat, beinhaltet die ausgewiesene Zeit nur die Zeit, bis die Anfrage zum Gerät gesendet wird, nicht die Wartezeit, während das Gerät die Anfragen neu ordnet.
Jeder Eintrag umfasst vier Felder: major, minor, operation, and bytes. major und minor sind die Gerätetypen und Knotennummern, die in den Linux Allocated Devices definiert sind. operation steht für die Art der Operation (read,write,syncoderasync) und time ist die Zeitspanne in Nanosekunden (ns). Die Zeit wird in Nanosekunden angegeben statt in größeren Einheiten, damit dieser Bericht auch für Solid-State-Geräte aussagekräftig ist. - blkio.io_merged
- zeigt die Anzahl an BIOS-Anfragen an, die in Anfragen für I/O-Operationen von einer Kontrollgruppe zusammengeführt werden. Jeder Eintrag umfasst zwei Felder: number und operation. number ist die Anzahl der Anfragen und operation steht für die Art der Operation (
read,write,syncoderasync). - blkio.io_queued
- zeigt die Anzahl an Anfragen an, die in der Warteschlange stehen für I/O-Operationen von einer Kontrollgruppe. Jeder Eintrag umfasst zwei Felder: number und operation. number ist die Anzahl der Anfragen und operation steht für die Art der Operation (
read,write,syncoderasync). - blkio.avg_queue_size
- zeigt die durchschnittliche Größe der Warteschlange für I/O-Operationen von einer Kontrollgruppe an, über die Gesamtdauer der Existenz der Gruppe hinweg. Die Größe der Warteschlange wird jedes Mal ermittelt, wenn eine Warteschlange für diese Kontrollgruppe ein Zeitfenster zugeteilt bekommt. Beachten Sie, dass dieser Bericht nur verfügbar ist, falls
CONFIG_DEBUG_BLK_CGROUP=yauf dem System gesetzt ist. - blkio.group_wait_time
- zeigt die Gesamtdauer (in Nanosekunden — ns) an, die eine Kontrollgruppe auf die Zuteilung eines Zeitfensters für eine ihrer Warteschlangen wartet. Der Bericht wird jedes Mal aktualisiert, wenn eine Warteschlange für diese Kontrollgruppe ein Zeitfenster erhält. Falls Sie also diese Pseudodatei lesen, während die Kontrollgruppe auf ein Zeitfenster wartet, enthält der Bericht nicht die Zeit, die auf die Operation gewartet wird, die derzeit in der Warteschlange steht. Beachten Sie, dass dieser Bericht nur verfügbar ist, falls
CONFIG_DEBUG_BLK_CGROUP=yauf dem System gesetzt ist. - blkio.empty_time
- zeigt die Gesamtdauer (in Nanosekunden — ns) an, die eine Kontrollgruppe ohne jegliche ausstehende Anfragen ist. Der Bericht wird jedes Mal aktualisiert, wenn eine Warteschlange für diese Kontrollgruppe eine ausstehende Anfrage hat. Falls Sie also diese Pseudodatei lesen, während die Kontrollgruppe keine ausstehende Anfragen hat, enthält der Bericht nicht die Zeit, die in diesem Moment im leeren Zustand verbracht wird. Beachten Sie, dass dieser Bericht nur verfügbar ist, falls
CONFIG_DEBUG_BLK_CGROUP=yauf dem System gesetzt ist. - blkio.idle_time
- zeigt die Gesamtdauer (in Nanosekunden — ns) an, die der Scheduler für eine Kontrollgruppe untätig bleibt, während er auf eine bessere Anfrage wartet als jene, die bereits in anderen Warteschlangen stehen oder die von anderen Kontrollgruppen stammen. Der Bericht wird jedes Mal aktualisiert, wenn eine Gruppe nicht länger untätig ist. Falls Sie also diese Pseudodatei lesen, während die Kontrollgruppe untätig ist, enthält der Bericht nicht die Zeit, die derzeit untätig verbracht wird. Beachten Sie, dass dieser Bericht nur verfügbar ist, falls
CONFIG_DEBUG_BLK_CGROUP=yauf dem System gesetzt ist. - blkio.dequeue
- zeigt an, wie oft Anfragen für I/O-Operationen von einer Kontrollgruppe von bestimmten Geräten aus der Warteschlange entfernt wurden. Jeder Eintrag umfasst drei Felder: major, minor und number. major und minor sind die Gerätetypen und Knotennummern, die in den Linux Allocated Devices definiert sind. number ist die Anzahl der Anfragen der Gruppe, die aus der Warteschlange entfernt wurden. Beachten Sie, dass dieser Bericht nur verfügbar ist, falls
CONFIG_DEBUG_BLK_CGROUP=yauf dem System gesetzt ist. - blkio.reset_stats
- setzt die in anderen Pseudodateien aufgezeichneten Statistiken zurück. Schreiben Sie einen ganzzahligen Wert in diese Datei, um die Statistiken für diese Kontrollgruppe zurückzusetzen.
3.2. cpu Link kopierenLink in die Zwischenablage kopiert!
cpu-Subsystem disponiert CPU-Zugriff für Kontrollgruppen. Der Zugriff auf CPU-Ressourcen kann anhand der folgenden Parameter disponiert werden, wobei sich jeder in einer separaten Pseudodatei innerhalb des virtuellen Dateisystems der Kontrollgruppe befindet:
- cpu.shares
- beinhaltet einen ganzzahligen Wert, der einen relativen Anteil der CPU-Zeit bestimmt, der den Aufgaben in einer Kontrollgruppe zur Verfügung steht. Aufgaben in zwei Kontrollgruppen, bei denen
cpu.sharesauf1gesetzt ist, erhalten beispielsweise die gleiche CPU-Zeit. Aufgaben in einer Kontrollgruppe, bei dercpu.sharesauf2gesetzt ist, erhalten die doppelte CPU-Zeit im Vergleich zu Aufgaben in einer Kontrollgruppe, bei denencpu.sharesauf1gesetzt ist. - cpu.rt_runtime_us
- spezifiziert eine Zeitspanne in Mikrosekunden (µs, hier als "us" dargestellt) für die längste kontinuierliche Periode, in der die Aufgaben in einer Kontrollgruppe Zugriff auf CPU-Ressourcen besitzen. Das Einrichten dieser Grenze verhindert, dass Aufgaben in einer Kontrollgruppe CPU-Zeit für sich allein beanspruchen. Falls die Aufgaben in einer Kontrollgruppe in der Lage sein sollten, mindestens vier von fünf Sekunden auf CPU-Ressourcen zuzugreifen, setzen Sie
cpu.rt_runtime_usauf4000000undcpu.rt_period_usauf5000000. - cpu.rt_period_us
- spezifiziert eine Zeitspanne in Mikrosekunden (µs, hier als "us" dargestellt), wie häufig der Zugriff einer Kontrollgruppe auf CPU-Ressourcen neu zugewiesen werden soll. Falls die Aufgaben in einer Kontrollgruppe in der Lage sein sollten, mindestens vier von fünf Sekunden auf CPU-Ressourcen zuzugreifen, setzen Sie
cpu.rt_runtime_usauf4000000undcpu.rt_period_usauf5000000.
3.3. cpuacct Link kopierenLink in die Zwischenablage kopiert!
cpuacct) generiert automatische Berichte zu CPU-Ressourcen, die von Aufgaben in einer Kontrollgruppe (einschließlich der Aufgaben von untergeordneten Gruppen) beansprucht werden. Drei Berichte stehen zur Verfügung:
- cpuacct.stat
- zeigt die Anzahl der CPU-Zyklen (in den auf dem System durch
USER_HZdefinierten Einheiten) an, die von Aufgaben in dieser Kontrollgruppe samt Untergruppen sowohl in Benutzer-Modus und System (Kernel-) Modus beansprucht werden. - cpuacct.usage
- zeigt die gesamte CPU-Zeit (in Nanosekunden) an, die von allen Aufgaben in dieser Kontrollgruppe (inklusive in dieser Hierarchie untergeordnete Aufgaben) beansprucht wird.
- cpuacct.usage_percpu
- zeigt die CPU-Zeit (in Nanosekunden) an, die auf jeder CPU von allen Aufgaben in dieser Kontrollgruppe beansprucht wird (inklusive in der Hierarchie untergeordnete Prozesse).
3.4. cpuset Link kopierenLink in die Zwischenablage kopiert!
cpuset-Subsystem weist Kontrollgruppen individuelle CPUs und Speicherknoten zu. Jedes 'cpuset' kann anhand der folgenden Parameter bestimmt werden, wobei sich jeder in einer separaten Pseudodatei innerhalb des virtuellen Dateisystems der Kontrollgruppe befindet:
Wichtig
cpuset-Subsystem verwendet, müssen die Parameter cpuset.cpus und cpuset.mems definiert sein.
- cpuset.cpus (obligatorisch)
- spezifiziert die CPUs, auf die Aufgaben in dieser Kontrollgruppe Zugriff besitzen. Dies ist eine kommagetrennte Liste im ASCII-Format mit Bindestrichen ("
-") zur Darstellung von Bereichen. Zum Beispiel:0-2,16
0-2,16Copy to Clipboard Copied! Toggle word wrap Toggle overflow repräsentiert CPUs 0, 1, 2 und 16. - cpuset.mems (obligatorisch)
- spezifiziert die Speicherknoten, auf die Aufgaben in dieser Kontrollgruppe Zugriff besitzen. Dies ist eine kommagetrennte Liste im ASCII-Format mit Bindestrichen ("
-") zur Darstellung von Bereichen. Zum Beispiel:0-2,16
0-2,16Copy to Clipboard Copied! Toggle word wrap Toggle overflow repräsentiert Speicherknoten 0, 1, 2 und 16. - cpuset.memory_migrate
- beinhaltet ein Flag (
0oder1), das festlegt, ob eine Seite im Speicher auf einen neuen Knoten migrieren soll, falls sich die Werte incpuset.memsändern. Standardmäßig ist Speicher-Migration deaktiviert (0) und Seiten bleiben auf dem Knoten, dem sie ursprünglich zugewiesen wurden, auch wenn dieser Knoten nicht länger einer der Knoten ist, die aktuell incpuset.memsdefiniert sind. Falls aktiviert (1), migriert das System Seiten auf Speicherknoten im Rahmen der durchcpuset.memsdefinierten neuen Parameter und behält deren relative Platzierung bei, falls möglich. So werden beispielsweise Seiten auf dem zweiten Knoten auf der Liste, der ursprünglich viacpuset.memsdefiniert wurde, dem zweiten Knoten auf der Liste zugewiesen, jetzt definiert durchcpuset.mems, falls dieser Platz zur Verfügung steht. - cpuset.cpu_exclusive
- beinhaltet ein Flag (
0oder1), das definiert, ob andere 'cpusets' und deren über- und untergeordneten Sets die für diese 'cpuset' definierten CPUs gemeinsam nutzen können. Standardmäßig (0) werden keine CPUs exklusiv nur einem 'cpuset' zugewiesen. - cpuset.mem_exclusive
- beinhaltet ein Flag (
0oder1), das definiert, ob andere 'cpusets' die für diese 'cpuset' definierten Speicherknoten gemeinsam nutzen können. Standardmäßig (0) werden keine Speicherknoten exklusiv nur einem 'cpuset' zugewiesen. Das Reservieren von Speicherknoten für den exklusiven Gebrauch von einem 'cpuset' (1) ist im Endeffekt das gleiche, wie die Aktivierung eines Speicher-Hardwalls mitcpuset.mem_hardwall. - cpuset.mem_hardwall
- beinhaltet ein Flag (
0oder1), das definiert, ob Kernel-Zuweisungen von Speicherseiten und Puffer-Daten auf die Speicherknoten beschränkt werden soll, die für dieses 'cpuset' angegeben wurden. Standardmäßig (0) werden Seiten und Puffer-Daten von Prozessen, die zu mehreren Benutzern gehören, gemeinsam genutzt. Mit einer aktivierten Hardwall (1) kann die Benutzerzuweisung für jede Aufgabe getrennt gehalten werden. - cpuset.memory_pressure
- eine schreibgeschützte Datei, die einen laufenden Durchschnittswert des Speicherdrucks enthält, der von Prozessen in diesem 'cpuset' erzeugt wird. Der Wert in dieser Pseudodatei wird automatisch aktualisiert, wenn
cpuset.memory_pressure_enabledaktiviert ist. Ansonsten enthält die Pseudodatei den Wert0. - cpuset.memory_pressure_enabled
- beinhaltet ein Flag (
0oder1), das definiert, ob das System den von Prozessen in dieser Kontrollgruppe generierten Speicherdruck errechnen soll. Errechnete Werte werden incpuset.memory_pressureausgegeben und repräsentiert die Rate, mit der Prozesse derzeit verwendeten Speicher freizusetzen versuchen. Diese Rate wird als ganzzahliger Wert der Anzahl der Versuche zur Zurückgewinnung von Speicher pro Sekunde, multipliziert mit 1000, dargestellt. - cpuset.memory_spread_page
- beinhaltet ein Flag (
0oder1), das definiert, ob der Puffer des Dateisystems gleichmäßig auf den für dieses 'cpuset' zugewiesenen Speicherknoten verteilt werden soll. Standardmäßig (0) werden keine Versuche unternommen, Speicherseiten für diesen Puffer gleichmäßig zu verteilen und Puffer werden auf demselben Knoten platziert, auf dem der Prozess läuft, der sie erstellte. - cpuset.memory_spread_slab
- beinhaltet ein Flag (
0oder1), das definiert, ob Kernel-Slab-Caches für Datei-Eingabe/-Ausgabe Operationen gleichmäßig auf dem 'cpuset' verteilt werden sollen. Standardmäßig (0) werden keine Versuche unternommen, um Kernel-Slab-Caches gleichmäßig zu verteilen und Slab-Caches werden auf demselben Knoten platziert, auf dem der Prozess, der sie erstellte, läuft. - cpuset.sched_load_balance
- beinhaltet ein Flag (
0oder1), das definiert, ob der Kernel in diesem 'cpuset' die Lasten zwischen den CPUs verteilt. Standardmäßig (1) verteilt der Kernel Lasten, indem er Prozesse von überlasteten CPUs auf weniger ausgelastete CPUs verlegt.Beachten Sie jedoch, dass das Setzen dieses Flags in einer Kontrollgruppe keinerlei Auswirkungen hat, wenn die Lastverteilung in einer übergeordneten Kontrollgruppe aktiviert ist, da in diesem Fall die Lastverteilung bereits auf höherer Ebene stattfindet. Um die Lastverteilung in einer Kontrollgruppe zu deaktivieren, müssen Sie demzufolge auch in allen übergeordneten Gruppen in der Hierarchie die Lastverteilung deaktivieren. In diesem Fall sollten Sie berücksichtigen, ob die Lastverteilung für andere Gruppen auf gleicher Ebene (also "Geschwister" der fraglichen Kontrollgruppe) aktiviert sein sollte. - cpuset.sched_relax_domain_level
- beinhaltet einen ganzzahligen Wert zwischen
-1und einem kleinen, positiven Wert, welcher die Bandbreite der CPUs darstellt, innerhalb welcher der Kernel versuchen soll, die Last zu verteilen. Dieser Wert ist bedeutungslos, wenncpuset.sched_load_balancedeaktiviert ist.Der genaue Effekt dieses Wertes variiert abhängig von der Systemarchitektur, doch die folgenden Werte sind typisch:Die Werte von cpuset.sched_relax_domain_levelWert Effekt -1System-Standardwert für Lastverteilung verwenden 0Keine unmittelbare Lastverteilung durchführen. Lastverteilung erfolgt nur periodisch 1Umgehend die Last auf Threads auf demselben Kern verteilen 2Umgehend die Last auf Kernen in demselben Paket verteilen 3Umgehend die Last auf CPUs auf demselben Knoten oder Blade verteilen 4Umgehend die Last auf mehreren CPUs auf Architekturen mit Non-Uniform Memory Access (NUMA) verteilen 5Umgehend die Last auf allen CPUs auf Architekturen mit NUMA verteilen
3.5. devices Link kopierenLink in die Zwischenablage kopiert!
devices-Subsystem ermöglicht oder verwehrt Aufgaben in einer Kontrollgruppe Zugriff auf Geräte.
Wichtig
devices) ist als Technologievorschau in Red Hat Enterprise Linux 6 enthalten.
- devices.allow
- spezifiziert die Geräte, auf die Aufgaben in einer Kontrollgruppe Zugriff haben. Jeder Eintrag besitzt vier Felder: type, major, minor und access. Die in den Feldern type, major und minor verwendeten Werte entsprechen Gerätetypen und Knotennummern, die in den Linux Allocated Devices, auch bekannt als die Linux-Geräteliste, definiert sind und unter http://www.kernel.org/doc/Documentation/devices.txt abrufbar ist.
- type
- type kann einen der drei folgenden Werte besitzen:
a— umfasst alle Geräte, sowohl zeichenorientierte Geräte als auch blockorientierte Geräteb— definiert ein Blockgerätc— definiert ein Zeichengerät
- major, minor
- major und minor sind via Linux Allocated Devices definierte Geräteknotennummern. Die Major- und Minor-Nummern werden durch einen Doppelpunkt getrennt. Ein Beispiel:
8ist die Major-Nummer, die SCSI-Plattenlaufwerke definiert und die Minor-Nummer1definiert die erste Partition auf dem ersten SCSI-Plattenlaufwerk.8:1definiert daher komplett diese Partition und entspricht der Position im Dateisystem/dev/sda1.*steht für alle Major- bzw. alle Minor-Geräteknoten, z.B.9:*(alle RAID-Geräte) oder*:*(alle Geräte). - access
- access entspricht einer Sequenz aus einem oder mehreren Buchstaben:
r— ermöglicht Prozessen das Lesen von dem angegebenen Gerät.w— ermöglicht Prozessen das Schreiben auf das angegebene Gerät.m— ermöglicht Prozessen das Erstellen von Gerätedateien, die noch nicht existieren.
Wenn access beispielsweise alsrdefiniert wird, können Prozesse nur von dem angegebenen Gerät lesen. Wenn access jedoch alsrwdefiniert wird, können Prozesse von dem Gerät lesen und auf dieses schreiben.
- devices.deny
- spezifiziert Geräte, auf die Aufgaben in einer Kontrollgruppe keinen Zugriff haben. Die Syntax der Einträge entspricht
devices.allow. - devices.list
- zeigt die Geräte an, für die die Zugriffskontrolle für Aufgaben in dieser Kontrollgruppe eingestellt wurde.
3.6. freezer Link kopierenLink in die Zwischenablage kopiert!
freezer-Subsystem setzt Aufgaben in einer Kontrollgruppe zeitweilig aus oder setzt sie fort.
- freezer.state
freezer.statehat drei mögliche Werte:FROZEN— Aufgaben in der Kontrollgruppe sind ausgesetzt.FREEZING— Das System ist gerade dabei, Aufgaben in der Kontrollgruppe auszusetzen.THAWED— Aufgaben in der Kontrollgruppe wurden fortgesetzt.
- Verlegen Sie den Prozess in eine Kontrollgruppe in einer Hierarchie, mit der das
freezer-Subsystem verknüpft ist. - Setzen Sie diese Kontrollgruppe aus, um den darin enthaltenen Prozess auszusetzen.
FROZEN und THAWED nach freezer.state geschrieben werden können, wohingegen FREEZING nur gelesen, nicht aber geschrieben werden kann.
3.7. memory Link kopierenLink in die Zwischenablage kopiert!
memory-Subsystem erstellt automatische Berichte zu Speicherressourcen, die von den Aufgaben in einer Kontrollgruppe verwendet werden und setzt Grenzwerte für den Speicherverbrauch durch diese Aufgaben fest.
- memory.stat
- zeigt eine größere Bandbreite von Speicher-Statistiken an, wie in der folgenden Tabelle beschrieben:
Expand Tabelle 3.1. Werte, die von memory.stat angezeigt werden Statistik Beschreibung cacheSeiten-Cache, inklusive tmpfs(shmem), in Bytesrssanonymer und Swap-Cache-Speicher, exklusive tmpfs(shmem), in Bytesmapped_fileGröße von Memory-Mapped Dateien, inklusive tmpfs(shmem), in BytespgpginAnzahl der in den Seitenspeicher geschriebenen Seiten pgpgoutAnzahl der aus dem Seitenspeicher gelesenen Seiten swapSwap-Verwendung, in Bytes active_anonanonymer und Swap-Cache-Speicher auf aktiver least-recently-used (LRU) Liste, inklusive tmpfs(shmem), in Bytesinactive_anonanonymer und Swap-Cache-Speicher auf inaktiver LRU-Liste, inklusive tmpfs(shmem), in Bytesactive_fileDateigestützter Speicher auf aktiver LRU-Liste, in Bytes inactive_fileDateigestützter Speicher auf inaktiver LRU-Liste, in Bytes unevictableSpeicher, der nicht zurückgefordert werden kann, in Bytes hierarchical_memory_limitSpeichergrenze für die Hierarchie, welche die memory-Kontrollgruppe enthält, in Byteshierarchical_memsw_limitGrenze für Speicher plus Swap für die Hierarchie, welche die memory-Kontrollgruppe enthält, in BytesZusätzlich verfügt jede dieser Dateien (mit Ausnahme vonhierarchical_memory_limitundhierarchical_memsw_limit) über ein Gegenstück mit vorangestelltemtotal_, das nicht nur über die Kontrollgruppe berichtet, sondern auch über alle zugehörigen Untergruppen. Zum Beispiel zeigtswapden Swap-Verbrauch einer Kontrollgruppe an, undtotal_swapzeigt den gesamten Swap-Verbrauch einer Kontrollgruppe einschließlich aller untergeordneten Gruppen an.Wenn Sie die vonmemory.statangezeigten Werte interpretieren, beachten Sie, wie die verschiedenen Statistiken zusammenhängen:active_anon+inactive_anon= anonymer Speicher + Datei-Cache fürtmpfs+ Swap-CacheDemzufolge gilt:active_anon+inactive_anon≠rss, darssnichttmpfseinschließt.active_file+inactive_file= Cache - Größe vontmpfs
- memory.usage_in_bytes
- zeigt den aktuellen gesamten Speicherverbrauch von Prozessen in der Kontrollgruppe an (in Bytes).
- memory.memsw.usage_in_bytes
- zeigt die Summe des aktuellen Speicherverbrauchs plus Swap-Space-Verbrauch von Prozessen in der Kontrollgruppe an (in Bytes).
- memory.max_usage_in_bytes
- zeigt den maximalen Speicherverbrauch von Prozessen in der Kontrollgruppe an (in Bytes).
- memory.memsw.max_usage_in_bytes
- zeigt den maximalen Swap- und Speicherverbrauch von Prozessen in der Kontrollgruppe an (in Bytes).
- memory.limit_in_bytes
- legt die maximale Menge an Benutzerspeicher fest (inklusive Datei-Cache). Falls keine Einheiten angegeben werden, wird dieser Wert als Bytes interpretiert. Es ist jedoch möglich, Suffixe zur Darstellung von größeren Einheiten zu verwenden —
koderKfür Kilobytes,moderMfür Megabytes undgoderGfür Gigabytes.Sie könnenmemory.limit_in_bytesnicht dazu verwenden, um die Root-Kontrollgruppe zu begrenzen; nur Gruppen an niedrigerer Stelle in der Hierarchie können Sie Werte zuordnen.Schreiben Sie-1inmemory.limit_in_bytes, um jegliche vorhandene Grenzen zu entfernen. - memory.memsw.limit_in_bytes
- legt die maximale Menge für die Summe von Speicher und Swap-Space fest. Falls keine Einheiten angegeben werden, wird dieser Wert als Bytes interpretiert. Es ist jedoch möglich, Suffixe zur Darstellung von größeren Einheiten zu verwenden —
koderKfür Kilobytes,moderMfür Megabytes undgoderGfür Gigabytes.Sie könnenmemory.memsw.limit_in_bytesnicht dazu verwenden, um die Root-Kontrollgruppe zu begrenzen; nur Gruppen an niedrigerer Stelle in der Hierarchie können Sie Werte zuordnen.Schreiben Sie-1inmemory.memsw.limit_in_bytes, um jegliche vorhandene Grenzen zu entfernen. - memory.failcnt
- zeigt an, wie oft der in
memory.limit_in_bytesfestgelegte Wert für die Speichergrenze erreicht wurde. - memory.memsw.failcnt
- zeigt an, wie oft der in
memory.memsw.limit_in_bytesfestgelegte Grenzwert für die Summe von Speicher und Swap-Space erreicht wurde. - memory.force_empty
- wenn auf
0gesetzt, wird der Speicher von allen Seiten gelöscht, die von Aufgaben in dieser Kontrollgruppe verwendet werden. Diese Schnittstelle kann nur benutzt werden, wenn die Kontrollgruppe keine Aufgaben besitzt. Falls kein Speicher freigesetzt werden kann, wird es in eine übergeordnete Kontrollgruppe verschoben, falls möglich. Verwenden Siememory.force_empty, bevor Sie eine Kontrollgruppe verschieben, um das Verschieben von nicht mehr verwendeten Seiten-Caches auf die übergeordnete Kontrollgruppe zu vermeiden. - memory.swappiness
- spezifiziert die Tendenz des Kernels, Prozessspeicher, der von Aufgaben in dieser Kontrollgruppe beansprucht wird, aus dem Speicher auszulagern (Swap), anstatt die Seiten vom Seiten-Cache zurückzufordern. Dies entspricht der Tendenz, wie sie auch für das gesamte System in
/proc/sys/vm/swappinessdefiniert wird und wird genauso berechnet. Der Standardwert ist60. Werte unter60verringern die Tendenz des Kernels, Prozessspeicher auszulagern. Werte über60erhöhen die Tendenz des Kernels, Prozessspeicher auszulagern und bei Werten größer als100beginnt der Kernel, Seiten auszulagern, die Teil des Adressraums der Prozesse in dieser Kontrollgruppe sind.Beachten Sie, dass der Wert0nicht verhindert, dass Prozessspeicher ausgelagert wird; die Auslagerung kann nach wie vor erfolgen, wenn Systemspeicher knapp wird, da die globale Logik zur Verwaltung des virtuellen Speichers den Wert der Kontrollgruppe nicht liest. Um Seiten vollständig zu sperren, verwenden Siemlock()anstelle von Kontrollgruppen.Sie können Tendenz zur Auslagerung (Swappiness) für die folgenden Gruppen nicht ändern:- die Root-Kontrollgruppe, welche die Swappiness-Angabe aus
/proc/sys/vm/swappinessverwendet. - eine Kontrollgruppe, die über untergeordnete Gruppen verfügt.
- memory.use_hierarchy
- beinhaltet ein Flag (
0oder1), das definiert, ob Speicherverbrauch in einer Hierarchie von Kontrollgruppen berücksichtigt werden soll. Falls aktiviert (1), fordert der Speicher-Controller Speicher von untergeordneten Prozessen sowie von solchen Prozessen, die ihre Speichergrenze überschreiten, zurück. Standardmäßig (0) fordert der Controller keinen Speicher von untergeordneten Aufgaben zurück.
3.8. net_cls Link kopierenLink in die Zwischenablage kopiert!
net_cls-Subsystem markiert Netzwerkpakete mit einem Class-Identifier (classid), der es dem Linux-Traffic-Controller (tc) ermöglicht, Pakete zu identifizieren, die von einer bestimmten Kontrollgruppe stammen. Der Traffic-Controller kann so konfiguriert werden, dass Paketen aus verschiedenen Kontrollgruppen verschiedene Prioritäten zugewiesen werden.
- net_cls.classid
net_cls.classidenthält einen einzelnen Wert in Hexadezimal-Format, der ein Traffic-Control-Handle anzeigt. So stellt0x100001beispielsweise das Handle dar, das im von iproute2 verwendeten Format konventionell10:1geschrieben wird.Das Format für diese Handles lautet:0xAAAABBBB, wobei AAAA die Major-Nummer in Hexadezimal und BBBB die Minor-Nummer in Hexadezimal ist. Führende Nullen können Sie weglassen;0x10001ist dasselbe wie0x00010001und steht für1:1.
net_cls zu den Netzwerkpaketen hinzufügt.
3.9. ns Link kopierenLink in die Zwischenablage kopiert!
ns-Subsystem bietet einen Weg, um Prozesse in separate Namensräume zu gruppieren. Innerhalb eines bestimmten Namensraums können Prozesse miteinander agieren, sind jedoch von den Prozessen in anderen Namensräumen isoliert. Diese separaten Namensräume werden manchmal als Container bezeichnet, wenn sie zur Virtualisierung auf Betriebssystemebene eingesetzt werden.
3.10. Weitere Informationsquellen Link kopierenLink in die Zwischenablage kopiert!
Subsystem-spezifische Kernel-Dokumentation
/usr/share/doc/kernel-doc-<kernel_version>/Documentation/cgroups/-Verzeichnis (welches vom kernel-doc-Paket gestellt wird).
blkio-Subsystem —blkio-controller.txtcpuacct-Subsystem —cpuacct.txtcpuset-Subsystem —cpusets.txtdevices-Subsystem —devices.txtfreezer-Subsystem —freezer-subsystem.txtmemory-Subsystem —memory.txt
Anhang A. Versionsgeschichte Link kopierenLink in die Zwischenablage kopiert!
| Versionsgeschichte | ||||||
|---|---|---|---|---|---|---|
| Version 1-3.400 | 2013-10-31 | |||||
| ||||||
| Version 1-3 | 2012-07-18 | |||||
| ||||||
| Version 1.0-5 | Thu May 19 2011 | |||||
| ||||||
| Version 1.0-4 | Tue Mar 1 2011 | |||||
| ||||||
| Version 1.0-3 | Wed Nov 17 2010 | |||||
| ||||||
| Version 1.0-2 | Thu Nov 11 2010 | |||||
| ||||||
| Version 1.0-1 | Wed Nov 10 2010 | |||||
| ||||||
| Version 1.0-0 | Tue Nov 9 2010 | |||||
| ||||||