11 Prozesse in Namespaces und Control Groups (cgroups) verwalten

11.1 Einführung

Namespaces und Control Groups (cgroups) sind zwei Schlüsseltechnologien zur Isolierung und Verwaltung von Systemressourcen unter Linux. Namespaces isolieren verschiedene Aspekte des Betriebssystems, während cgroups Ressourcenzuweisung und -kontrolle ermöglichen. Dieser Artikel erläutert, wie man Prozesse in Namespaces startet und mit cgroups Ressourcen wie CPU und Speicher limitiert.

11.2 Namespaces

Namespaces isolieren verschiedene Systemressourcen, wie Prozesse, Netzwerk, Benutzer, Mounts, und IPC. Ein neuer Namespace kann mit dem Befehl unshare erstellt werden.

11.2.1 Beispiel: Prozess in einem neuen PID- und Mount-Namespace starten

sudo unshare -p --fork --mount-proc=/proc /bin/bash

Dieser Befehl startet eine neue Bash-Shell in einem separaten PID-Namespace und mountet das /proc-Verzeichnis für diesen Namespace.

11.3 Control Groups (cgroups)

cgroups sind ein Linux-Kernel-Feature zur Verwaltung und Limitierung von Ressourcen wie CPU, Speicher, I/O, etc. cgroups können hierarchisch organisiert werden, und jeder Prozess kann in eine oder mehrere cgroups eingeordnet werden.

11.3.1 Erstellung einer neuen cgroup

Verwenden Sie systemd oder direkt das cgroups-Dateisystem.

11.3.1.1 Mit systemd

sudo systemctl set-property my_service.slice CPUQuota=20%

Dies limitiert die CPU-Nutzung der Dienste innerhalb von my_service.slice auf 20%.

11.3.1.2 Direktes Erstellen und Verwalten einer cgroup

  1. Erstellen einer neuen cgroup für CPU und Speicher:

    sudo mkdir /sys/fs/cgroup/cpu/my_cgroup
    sudo mkdir /sys/fs/cgroup/memory/my_cgroup
  2. Limitiere die CPU-Zeit auf 50%:

    echo 50000 | sudo tee /sys/fs/cgroup/cpu/my_cgroup/cpu.cfs_quota_us
    echo 100000 | sudo tee /sys/fs/cgroup/cpu/my_cgroup/cpu.cfs_period_us
  3. Limitiere den Speicher auf 512MB:

    echo 536870912 | sudo tee /sys/fs/cgroup/memory/my_cgroup/memory.limit_in_bytes
  4. Füge einen Prozess zur cgroup hinzu:

    echo <PID> | sudo tee /sys/fs/cgroup/cpu/my_cgroup/cgroup.procs
    echo <PID> | sudo tee /sys/fs/cgroup/memory/my_cgroup/cgroup.procs

11.4 Anzeigen der Prozesse und Ressourcen in cgroups

11.4.1 Mit systemd-cgtop

sudo systemd-cgtop

Dieses Tool zeigt eine Übersicht der Ressourcennutzung nach cgroups sortiert.

11.4.2 Mit systemctl status

systemctl status my_service.slice

Dies zeigt den Status der cgroup und die darin enthaltenen Prozesse.

11.4.3 Mit direkten Dateisystemzugriffen

cat /sys/fs/cgroup/cpu/my_cgroup/cgroup.procs
cat /sys/fs/cgroup/memory/my_cgroup/memory.usage_in_bytes

Diese Befehle zeigen die Prozesse in der cgroup und die genutzten Ressourcen.

11.5 Beispiel: Prozess starten und Ressourcen limitieren

  1. Erstellen Sie die cgroup-Verzeichnisse:

    sudo mkdir /sys/fs/cgroup/cpu/test_cgroup
    sudo mkdir /sys/fs/cgroup/memory/test_cgroup
  2. Limitieren Sie die Ressourcen:

    echo 200000 | sudo tee /sys/fs/cgroup/cpu/test_cgroup/cpu.cfs_quota_us
    echo 1000000 | sudo tee /sys/fs/cgroup/cpu/test_cgroup/cpu.cfs_period_us
    echo 1073741824 | sudo tee /sys/fs/cgroup/memory/test_cgroup/memory.limit_in_bytes
  3. Starten Sie einen neuen Prozess in dieser cgroup:

    sudo unshare -p --fork --mount-proc=/proc sh -c 'echo $$ | sudo tee /sys/fs/cgroup/cpu/test_cgroup/cgroup.procs; echo $$ | sudo tee /sys/fs/cgroup/memory/test_cgroup/cgroup.procs; exec /bin/bash'

Dieser Befehl startet eine neue Bash-Shell in einem separaten PID-Namespace und fügt diese Shell zur CPU- und Speicher-cgroup hinzu.

Die Kombination von Namespaces und cgroups ermöglicht eine feingranulare Kontrolle über Prozesse und Systemressourcen. Diese Technologien sind fundamental für die Containerisierung und das Ressourcenmanagement in modernen Linux-Umgebungen. Durch die Verwendung von Befehlen wie unshare, systemd-cgtop und direkten cgroup-Konfigurationsdateien können Prozesse effizient isoliert und verwaltet werden.