# cgroups

<div _ngcontent-ng-c3411460001="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-control-groups-%28cgro" inline-copy-host=""><div>**Control Groups (cgroups)** spielen eine zentrale Schlüsselrolle in `systemd`. Sie bilden das fundamentale Kernel-Feature, mit dem `systemd` Prozesse **gruppiert, verfolgt, isoliert und bezüglich ihrer Systemressourcen beschränkt**.</div>  
<div>Vor `systemd` nutzten klassische Init-Systeme (wie SysVinit) Prozess-IDs (PIDs) und PID-Dateien (`.pid`), um zu verfolgen, welche Prozesse zu welchem Dienst gehörten. Wenn ein Dienst Tochterprozesse erzeugte (z. B. ein Apache-Webserver mit vielen Worker-Prozessen) und abstürzte oder unsauber beendet wurde, blieben verwaiste Prozesse („Zombie-Prozesse“) im System zurück.</div>  
<div>Mit cgroups gelingt `systemd` die vollständige und lückenlose Prozesskontrolle.</div>  
</div>### 1. Die Kernaufgaben von cgroups in systemd

#### A. Lückenloses Prozess-Tracking (Keine "Verwaisten Prozesse")

<div _ngcontent-ng-c3411460001="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-jeder-dienst%2C-den-sy" inline-copy-host=""><div>Jeder Dienst, den `systemd` startet, wird in seine eigene cgroup platziert.</div>  
- <div>Wenn ein Prozess neue Tochterprozesse startet (`fork()`), erben diese **automatisch** dieselbe cgroup.</div>
- <div>Selbst wenn sich ein Dämon versucht zu tarnen oder von seinem Elternprozess abspaltet, bleibt er in der cgroup gefangen.</div>
- <div>**Ergebnis:** Wenn Sie `systemctl stop mein-dienst` ausführen, sendet `systemd` das Stopp-Signal an die *gesamte cgroup*. Dadurch werden verlässlich **alle** dazugehörigen Prozesse beendet.</div>

</div>#### B. Ressourcenbeschränkung und -kontrolle (Resource Limiting)

<div _ngcontent-ng-c3411460001="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%C3%9Cber-cgroups-kann-sy" inline-copy-host=""><div>Über cgroups kann `systemd` genau festlegen, wie viel Hardware-Ressourcen eine Unit oder eine Gruppe von Units verbrauchen darf. Sie können das direkt in der Unit-Datei konfigurieren:</div>  
- <div>**Arbeitsspeicher (RAM):**</div>  
    
    - <div>`MemoryMax=500M` – Der Dienst darf maximal 500 MB RAM nutzen. Wächst er darüber hinaus, greift der Out-Of-Memory (OOM) Killer gezielt für diesen Dienst.</div>
    - <div>`MemoryHigh=400M` – Drosselt den Prozess sanft ab 400 MB, bevor das harte Limit erreicht wird.</div>
- <div>**CPU-Leistung:**</div>  
    
    - <div>`CPUQuota=50%` – Beschränkt den Dienst auf maximal 50% eines CPU-Kerns.</div>
    - <div>`CPUWeight=100` – Priorisierung der CPU-Zeit im Vergleich zu anderen cgroups (Standard ist 100).</div>
- <div>**Festplatten-I/O:**</div>  
    
    - <div>`IOReadBandwidthMax=/dev/sda 10M` – Beschränkt das Lesen von der Festplatte auf 10 MB/s.</div>
- <div>**Tasks/Prozesse (Fork-Bomb-Schutz):**</div>  
    
    - <div>`TasksMax=100` – Der Dienst darf maximal 100 Unterprozesse/Threads gleichzeitig öffnen.</div>

</div>### 2. Die cgroup-Hierarchie in systemd

<div _ngcontent-ng-c3411460001="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-systemd-baut-beim-sy" inline-copy-host=""><div>`systemd` baut beim Systemstart eine baumartige Struktur unter dem virtuellen Dateisystem `/sys/fs/cgroup/` auf. Diese Struktur unterteilt die Last des Systems in drei Hauptzweige (Slices):</div>  
</div><div _ngcontent-ng-c25623069="" class="code-block ng-tns-c25623069-45 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiClvfBpYeXAxUAAAAAHQAAAAAQvQE" decode-data-ved="1" id="bkmrk-plaintext" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl8wNDYyOWQzODFmM2E1YmYxIiwiY18wZTZlNDNlZDM5MjgwNDI1IixudWxsLCJyY184Y2JjNDE1MDIxY2E3NTA2IixudWxsLG51bGwsImRlIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c25623069="" class="formatted-code-block-internal-container ng-tns-c25623069-45"><div _ngcontent-ng-c25623069="" class="animated-opacity ng-tns-c25623069-45"><div _ngcontent-ng-c25623069="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c25623069-45 ng-star-inserted"><span class="ng-tns-c25623069-45">Plaintext</span><div _ngcontent-ng-c25623069="" class="buttons ng-tns-c25623069-45 ng-star-inserted"><button aria-label="Code herunterladen" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Code kopieren" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
/sys/fs/cgroup/
├── system.slice      --> Alle Systemdienste (z. B. nginx, sshd, docker)
├── user.slice        --> Angemeldete Benutzer & deren Sitzungen/Prozesse
└── machine.slice     --> Virtuelle Maschinen (KVM/QEMU) & LXC/Systemd-Container

```

<div _ngcontent-ng-c25623069="" class="code-block ng-tns-c25623069-45 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiClvfBpYeXAxUAAAAAHQAAAAAQvQE" decode-data-ved="1" id="bkmrk-" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl8wNDYyOWQzODFmM2E1YmYxIiwiY18wZTZlNDNlZDM5MjgwNDI1IixudWxsLCJyY184Y2JjNDE1MDIxY2E3NTA2IixudWxsLG51bGwsImRlIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c25623069="" class="formatted-code-block-internal-container ng-tns-c25623069-45"><div _ngcontent-ng-c25623069="" class="animated-opacity ng-tns-c25623069-45"></div></div></div><div _ngcontent-ng-c3411460001="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-slices-%28.slice%29%3A-log" inline-copy-host="">- <div>**Slices (`.slice`):** Logische Gruppen, um Ressourcen hierarchisch zu verteilen (z. B. "Systemdienste bekommen insgesamt maximal 70% CPU, angemeldete User 30%").</div>
- <div>**Scopes (`.scope`):** Automatisch erstellte Gruppen für Prozesse, die nicht von `systemd` selbst gestartet wurden (z. B. eine SSH-Benutzersitzung).</div>
- <div>**Services (`.service`):** Die einzelnen Dienste innerhalb der Slices.</div>

</div>### 3. Befehle zum Anzeigen und Steuern von cgroups

#### Der Befehl `systemd-cgls` (cgroup list)

<div _ngcontent-ng-c3411460001="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-zeigt-den-gesamten-c" inline-copy-host=""><div>Zeigt den gesamten cgroup-Baum des Systems inklusive aller laufenden PIDs an:</div>  
</div><div _ngcontent-ng-c25623069="" class="code-block ng-tns-c25623069-46 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiClvfBpYeXAxUAAAAAHQAAAAAQvgE" decode-data-ved="1" id="bkmrk-bash" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl8wNDYyOWQzODFmM2E1YmYxIiwiY18wZTZlNDNlZDM5MjgwNDI1IixudWxsLCJyY184Y2JjNDE1MDIxY2E3NTA2IixudWxsLG51bGwsImRlIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c25623069="" class="formatted-code-block-internal-container ng-tns-c25623069-46"><div _ngcontent-ng-c25623069="" class="animated-opacity ng-tns-c25623069-46"><div _ngcontent-ng-c25623069="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c25623069-46 ng-star-inserted"><span class="ng-tns-c25623069-46">Bash</span><div _ngcontent-ng-c25623069="" class="buttons ng-tns-c25623069-46 ng-star-inserted"><button aria-label="Code herunterladen" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Code kopieren" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
systemd-cgls

```

<div _ngcontent-ng-c25623069="" class="code-block ng-tns-c25623069-46 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiClvfBpYeXAxUAAAAAHQAAAAAQvgE" decode-data-ved="1" id="bkmrk--1" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl8wNDYyOWQzODFmM2E1YmYxIiwiY18wZTZlNDNlZDM5MjgwNDI1IixudWxsLCJyY184Y2JjNDE1MDIxY2E3NTA2IixudWxsLG51bGwsImRlIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c25623069="" class="formatted-code-block-internal-container ng-tns-c25623069-46"><div _ngcontent-ng-c25623069="" class="animated-opacity ng-tns-c25623069-46"></div></div></div><div _ngcontent-ng-c3411460001="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk--2" inline-copy-host=""></div>#### Der Befehl `systemd-cgtop` (cgroup top)

<div _ngcontent-ng-c3411460001="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-%C3%84hnlich-wie-der-norm" inline-copy-host=""><div>Ähnlich wie der normale `top`-Befehl, zeigt aber den Live-Ressourcenverbrauch (CPU, RAM, I/O) aufgeteilt nach cgroups/Services an:</div>  
</div><div _ngcontent-ng-c25623069="" class="code-block ng-tns-c25623069-47 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiClvfBpYeXAxUAAAAAHQAAAAAQvwE" decode-data-ved="1" id="bkmrk-bash-1" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl8wNDYyOWQzODFmM2E1YmYxIiwiY18wZTZlNDNlZDM5MjgwNDI1IixudWxsLCJyY184Y2JjNDE1MDIxY2E3NTA2IixudWxsLG51bGwsImRlIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c25623069="" class="formatted-code-block-internal-container ng-tns-c25623069-47"><div _ngcontent-ng-c25623069="" class="animated-opacity ng-tns-c25623069-47"><div _ngcontent-ng-c25623069="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c25623069-47 ng-star-inserted"><span class="ng-tns-c25623069-47">Bash</span><div _ngcontent-ng-c25623069="" class="buttons ng-tns-c25623069-47 ng-star-inserted"><button aria-label="Code herunterladen" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Code kopieren" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
systemd-cgtop

```

<div _ngcontent-ng-c25623069="" class="code-block ng-tns-c25623069-47 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiClvfBpYeXAxUAAAAAHQAAAAAQvwE" decode-data-ved="1" id="bkmrk--3" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl8wNDYyOWQzODFmM2E1YmYxIiwiY18wZTZlNDNlZDM5MjgwNDI1IixudWxsLCJyY184Y2JjNDE1MDIxY2E3NTA2IixudWxsLG51bGwsImRlIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c25623069="" class="formatted-code-block-internal-container ng-tns-c25623069-47"><div _ngcontent-ng-c25623069="" class="animated-opacity ng-tns-c25623069-47"></div></div></div><div _ngcontent-ng-c3411460001="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk--4" inline-copy-host=""></div>#### Ressourcen zur Laufzeit anpassen

<div _ngcontent-ng-c3411460001="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-sie-k%C3%B6nnen-limits-ei" inline-copy-host=""><div>Sie können Limits eines laufenden Dienstes dynamisch anpassen, ohne die Unit-Datei manuell zu bearbeiten:</div>  
</div><div _ngcontent-ng-c25623069="" class="code-block ng-tns-c25623069-48 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiClvfBpYeXAxUAAAAAHQAAAAAQwAE" decode-data-ved="1" id="bkmrk-bash-2" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl8wNDYyOWQzODFmM2E1YmYxIiwiY18wZTZlNDNlZDM5MjgwNDI1IixudWxsLCJyY184Y2JjNDE1MDIxY2E3NTA2IixudWxsLG51bGwsImRlIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c25623069="" class="formatted-code-block-internal-container ng-tns-c25623069-48"><div _ngcontent-ng-c25623069="" class="animated-opacity ng-tns-c25623069-48"><div _ngcontent-ng-c25623069="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c25623069-48 ng-star-inserted"><span class="ng-tns-c25623069-48">Bash</span><div _ngcontent-ng-c25623069="" class="buttons ng-tns-c25623069-48 ng-star-inserted"><button aria-label="Code herunterladen" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Code kopieren" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
# Setzt das Arbeitsspeicher-Limit für Nginx sofort auf 1 GB
systemctl set-property nginx.service MemoryMax=1G

```

<div _ngcontent-ng-c25623069="" class="code-block ng-tns-c25623069-48 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiClvfBpYeXAxUAAAAAHQAAAAAQwAE" decode-data-ved="1" id="bkmrk--5" jslog="223238;track:impression,attention;BardVeMetadataKey:W1sicl8wNDYyOWQzODFmM2E1YmYxIiwiY18wZTZlNDNlZDM5MjgwNDI1IixudWxsLCJyY184Y2JjNDE1MDIxY2E3NTA2IixudWxsLG51bGwsImRlIixudWxsLDEsbnVsbCxudWxsLDEsMF1d"><div _ngcontent-ng-c25623069="" class="formatted-code-block-internal-container ng-tns-c25623069-48"><div _ngcontent-ng-c25623069="" class="animated-opacity ng-tns-c25623069-48"></div></div></div><div _ngcontent-ng-c3411460001="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk--6" inline-copy-host=""></div>### 4. Die Bedeutung von cgroups für Container (Docker, Podman)

<div _ngcontent-ng-c3411460001="" aria-busy="false" aria-live="polite" class="markdown markdown-main-panel md-content enable-luminous-fast-follows enable-updated-hr-color" dir="ltr" id="bkmrk-cgroups-sind-zusamme" inline-copy-host=""><div>Cgroups sind zusammen mit Linux **Namespaces** die fundamentale Grundlage moderner Container-Technologien:</div>  
- <div>**Namespaces** sorgen für die *Isolierung* (Der Container sieht nur seine eigenen Dateien, Netzwerke und Prozesse).</div>
- <div>**CGroups** sorgen für die *Ressourcenbegrenzung* (Der Container kann das Wirtssystem nicht lahmlegen).</div>

<div>Da `systemd` cgroups nativ verwaltet, integrieren sich Container-Runtimes wie Docker, Podman oder `containerd` meist direkt mit dem `systemd`-cgroup-Treiber.</div></div>