2.9. Starten eines Prozesses in einer Kontrollgruppe

Wichtig

Einige Controller besitzen Pflichtparameter, die Sie setzen müssen, bevor Sie eine Aufgabe in eine Kontrollgruppe verlegen können, die eine dieser Subsysteme verwendet. Bevor Sie beispielsweise eine Aufgabe in eine Kontrollgruppe verlegen, die das cpuset-Subsystem verwendet, müssen die Parameter cpuset.cpus und cpuset.mems definiert sein.
Die Beispiele in diesem Abschnitt verdeutlichen die korrekte Syntax für den Befehl, funktionieren jedoch nur auf Systemen, auf denen die relevanten Pflichtparameter für jegliche in diesen Beispielen verwendeten Controller gesetzt wurden. Falls Sie die relevanten Controller nicht bereits konfiguriert haben, können Sie die Beispiel-Befehle aus diesem Abschnitt nicht direkt kopieren und damit rechnen, dass sie auf Ihrem System funktionieren.
Siehe Abschnitt 3.10, »Weitere Informationsquellen« für eine Beschreibung, welche Parameter für bestimmte Subsysteme obligatorisch sind.
Sie können Prozesse in einer Kontrollgruppe starten, indem Sie den 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
Die Syntax für 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 beim cgset-Befehl in Abschnitt 2.7, »Einstellen von Parametern« beschrieben), dass die -g Option 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
Sie können auch die Option -- 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

Wenn Sie einen neuen Prozess starten, erbt dieser die Gruppe seines übergeordneten Prozesses. Demzufolge können Sie, um einen Prozess in einer bestimmten Kontrollgruppe zu starten, Ihren Shell-Prozess auch in die gewünschte Gruppe verlegen (siehe Abschnitt 2.8, »Verschieben eines Prozesses in eine Kontrollgruppe«) und anschließend den Prozess von dieser Shell aus starten. Zum Beispiel:
~]# echo $$ > /cgroup/lab1/group1/tasks
lynx
Beachten Sie, dass nach dem Beenden von lynx Ihre existierende Shell sich immer noch in der group1-Kontrollgruppe befindet. Ein noch besseres Vorgehen ist deshalb:
~]# sh -c "echo \$$ > /cgroup/lab1/group1/tasks && lynx"

2.9.1. Starten eines Dienstes in einer Kontrollgruppe

Sie können bestimmte Dienste in einer Kontrollgruppe starten. Dienste, die in Kontrollgruppen gestartet werden können, müssen die folgenden Eigenschaften haben:
  • sie müssen eine /etc/sysconfig/servicename-Datei verwenden
  • sie müssen die daemon()-Funktion von /etc/init.d/functions verwenden, um den Dienst zu starten
Damit ein Dienst, der diese Voraussetzungen erfüllt, in einer Kontrollgruppe startet, fügen Sie in dessen Datei im /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"