6.1 Gründe, Ressourcen von Containern zu begrenzen
Docker macht einen super Job beim Ressourcenmanagement von Containern, was es ermöglicht, die Systemleistung effizient zu verteilen und unnötige Konflikte zwischen Containern zu vermeiden. Das ist besonders wichtig, damit eine Anwendung in einem Container nicht alle Ressourcen "frisst" und den Betrieb anderer Services verlangsamt. Das Begrenzen von Ressourcen wie CPU und Arbeitsspeicher hilft dabei, Überlastungen zu vermeiden, die Systemstabilität zu wahren und sicherzustellen, dass alle Anwendungen vorhersehbar laufen. In dieser Vorlesung schauen wir uns an, wie man Limits für die Nutzung von CPU und Arbeitsspeicher setzt, damit das System auch bei hoher Auslastung produktiv bleibt.
Warum es wichtig ist, Ressourcen von Containern zu begrenzen:
- Stabilität: Vermeidung von Situationen, in denen ein Container alle Ressourcen belegt, wodurch andere Container oder das System selbst langsamer werden.
- Effizienz: Bessere Verteilung der Ressourcen zwischen den Containern, um die Systemleistung maximal produktiv zu nutzen.
- Schutz: Das Begrenzen von Ressourcen hilft, Probleme mit Containern zu verhindern, die das System versehentlich oder absichtlich überlasten könnten.
6.2 Limits für die Nutzung von CPU
Docker bietet mehrere Möglichkeiten, die Nutzung von CPU
durch Container zu begrenzen.
Wichtig!
Unter CPU
versteht man hier einen Prozessorkern, nicht den gesamten Prozessor. Ein Prozessor mit vier Kernen hat also 4 CPU
.
1. Begrenzung des CPU
-Anteils (--cpu-shares
)
Der Parameter --cpu-shares
legt einen relativen Prioritätswert für die Nutzung der CPU durch den Container fest. Der Standardwert ist 1024. Das ist ein relativer Wert, was bedeutet, dass ein Container mit --cpu-shares=512
die Hälfte der Priorität eines Containers mit --cpu-shares=1024
hat.
Beispiel:
In diesem Beispiel wird der Container high_priority_container
eine höhere Priorität bei der Verteilung von CPU
haben als low_priority_container
.
docker run -d --name low_priority_container --cpu-shares=512 nginx
docker run -d --name high_priority_container --cpu-shares=2048 nginx
2. Begrenzung der Anzahl von CPU
(--cpus
)
Der Parameter --cpus
legt die genaue Anzahl der CPU
fest, die dem Container zur Verfügung steht. Zum Beispiel bedeutet der Wert 1.5, dass der Container 1.5 CPU
nutzen kann.
Beispiel:
Dieses Beispiel begrenzt den Container limited_cpu_container
auf die Nutzung von maximal 1.5 CPU
.
docker run -d --name limited_cpu_container --cpus="1.5" nginx
3. Begrenzung der CPU-Zeit (--cpu-quota
und --cpu-period
)
Die Parameter --cpu-quota
und --cpu-period
erlauben eine detailliertere Steuerung der CPU
-Nutzung. --cpu-period
legt das Zeitintervall in Mikrosekunden fest (standardmäßig 100000), und --cpu-quota
gibt die maximal erlaubte CPU
-Zeit für dieses Intervall an.
Beispiel:
In diesem Beispiel wird der Container custom_cpu_quota_container
maximal 50% der CPU
nutzen (25000/50000).
docker run -d --name custom_cpu_quota_container --cpu-period=50000 --cpu-quota=25000 nginx
6.3 Begrenzung des Speicherverbrauchs
Eine Speicherbegrenzung ermöglicht es, zu kontrollieren, wie viel RAM ein Container nutzen darf. Das hilft zu vermeiden, dass ein Container anfängt, "den ganzen Speicher zu fressen" und dabei andere Prozesse und Container beeinträchtigt.
1. Begrenzung des maximalen Speicherwerts (--memory)
Der Parameter --memory
legt eine Obergrenze für den Speicher fest, den der Container verwenden darf. Wenn der Container dieses Limit überschreitet, wird er vom System gestoppt.
Beispiel:
Dieses Beispiel begrenzt den Container limited_memory_container
auf maximal 512 MB RAM.
docker run -d --name limited_memory_container --memory="512m" nginx
2. Begrenzung des Swap-Speichers (--memory-swap)
Der Parameter --memory-swap
legt das Gesamtlimit für RAM und Swap-Speicher fest. Zum Beispiel, wenn --memory
auf 512 MB und --memory-swap
auf 1 GB gesetzt wird, kann der Container bis zu 512 MB RAM und zusätzlich 512 MB Swap verwenden.
Beispiel:
Dieses Beispiel begrenzt den Container swap_limited_container
auf 512 MB RAM und 512 MB Swap-Speicher.
docker run -d --name swap_limited_container --memory="512m" --memory-swap="1g" nginx
3. Begrenzung des Speicherverbrauchs ohne Swap (--memory-swap=-1)
Wenn du den Swap-Speicher vollständig deaktivieren möchtest, setze den Parameter --memory-swap
auf -1.
Beispiel:
Dieses Beispiel begrenzt den Container no_swap_container
auf 512 MB RAM ohne die Möglichkeit, Swap zu nutzen.
docker run -d --name no_swap_container --memory="512m" --memory-swap="-1" nginx
6.4 Praktische Szenarien
1. Start von hochpriorisierten und niedrigpriorisierten Aufgaben
Wenn auf einem Server sowohl wichtige als auch nachrangige Aufgaben ausgeführt werden, hilft der Parameter --cpu-shares
, die Ressourcen so zu verteilen, dass kritische Aufgaben mehr CPU
erhalten.
docker run -d --name high_priority_task --cpu-shares=2048 my_high_priority_image
docker run -d --name low_priority_task --cpu-shares=512 my_low_priority_image
2. Ressourcenbeschränkungen für Tests
Um Anwendungen unter Bedingungen mit begrenzten Ressourcen zu testen, kann man harte Grenzen für CPU
und Speicher festlegen. Das hilft dabei, zu verstehen, wie die Anwendung unter solchen Einschränkungen funktioniert.
docker run -d --name test_container --cpus="1" --memory="256m" my_test_image
3. Schutz vor Ressourcenerschöpfung
Um Situationen zu vermeiden, in denen ein Container alle verfügbaren Systemressourcen verbraucht, kann man Speicher- und CPU
-Limits für alle Container festlegen.
docker run -d --name isolated_container --cpus="2" --memory="1g" my_app_image
GO TO FULL VERSION