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.
Namespaces isolieren verschiedene Systemressourcen, wie Prozesse,
Netzwerk, Benutzer, Mounts, und IPC. Ein neuer Namespace kann mit dem
Befehl unshare
erstellt werden.
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.
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.
Verwenden Sie systemd
oder direkt das
cgroups-Dateisystem.
systemd
sudo systemctl set-property my_service.slice CPUQuota=20%
Dies limitiert die CPU-Nutzung der Dienste innerhalb von
my_service.slice
auf 20%.
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
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
Limitiere den Speicher auf 512MB:
echo 536870912 | sudo tee /sys/fs/cgroup/memory/my_cgroup/memory.limit_in_bytes
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
systemd-cgtop
sudo systemd-cgtop
Dieses Tool zeigt eine Übersicht der Ressourcennutzung nach cgroups sortiert.
systemctl status
systemctl status my_service.slice
Dies zeigt den Status der cgroup und die darin enthaltenen Prozesse.
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.
Erstellen Sie die cgroup-Verzeichnisse:
sudo mkdir /sys/fs/cgroup/cpu/test_cgroup
sudo mkdir /sys/fs/cgroup/memory/test_cgroup
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
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.