Ich versuche, meinen Container zu begrenzen, so dass es nicht den gesamten RAM auf dem Host belegt. Von the Docker docs Ich verstehe, dass --memory
begrenzt den RAM und --memory-swap
Grenzen (RAM + Swap). Von the docker-compose docs sieht es aus wie die Bedingungen für diejenigen, sind mem_limit
und memswap_limit
, so dass ich die folgende Docker-compose Datei aufgebaut haben:Fähig zu malloc mehr als docker-komponieren mem_limit
> cat docker-compose.yml
version: "2"
services:
stress:
image: progrium/stress
command: '-m 1 --vm-bytes 15G --vm-hang 0 --timeout 10s'
mem_limit: 1g
memswap_limit: 2g
Die progrium/stress image nur stress
läuft, die in diesem Fall einen einzigen Thread laicht die 15GB fordert RAM und hält es für 10 Sekunden.
Ich würde erwarten, dass dies abstürzen wird, seit 15> 2. (Es ist abstürzen, wenn ich für mehr RAM fragen, als der Wirt hat.)
Der Kernel hat cgroups aktiviert und docker stats
zeigt, dass die Grenze erkannt wird:
> docker stats
CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O BLOCK I/O PIDS
7624a9605c70 0.00% 1024MiB/1GiB 99.99% 396B/0B 172kB/0B 2
Also, was ist los? Wie beschränke ich den Container eigentlich?
Update: free
Zusehen, es sieht aus wie die RAM-Auslastung effektiv begrenzt ist (nur 1 GB RAM verwendet wird), aber die Swap ist nicht: Der Behälter wird nach und nach Swap-Nutzung erhöhen, bis sie, obwohl alle des Swap gegessen und stress
stürzt ab (es dauert etwa 20 Sekunden, um 5 GB Swap auf meinem Rechner zu bekommen).
Update 2: mem_swappiness: 0
Einstellung bewirkt einen sofortigen Absturz, wenn mehr Speicher als mem_limit
, unabhängig von memswap_limit
anfordert.