Ich habe einen Docker-Container, der meinen in Python Flask geschriebenen REST-Service ausführt. Ich verwende den Container mit VirtualBox unter OSx.Warum stürzt Docker bei hoher Speicherauslastung ab?
Dies ist die Speicher Statistiken über OSx zu der Zeit wird der Behälter gestartet:
Also, ich habe ~ 3 GB Speicher frei. Also ich betreiben meinen Behälter mit Speichergrenze von 2 GB
docker run -d -m 2g --name mycontainer -p 5000:5000 foobar
Jetzt schicke ich ~ 100 REST-Anfragen an den Dienst auf den Behälter läuft, während zur gleichen Zeit docker stats
läuft.
Schließlich stürzt der Andock-Container ab.
Ich schreibe unterhalb der Daten von docker stats
kurz bevor der Container abstürzt.
Absturz 1: Bei der Ausführung 100 verschiedene Anforderungen (Container stürzen fast augenblicklich
CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O BLOCK I/O
27ee4ed4f98a 99.27% 256.9 MB/2.147 GB 11.96% 163.2 kB/7.958 kB 107.4 MB/0 B
CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O BLOCK I/O
27ee4ed4f98a 99.77% 324 MB/2.147 GB 15.09% 163.2 kB/7.958 kB 107.4 MB/0 B
CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O BLOCK I/O
CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O BLOCK I/O
CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O BLOCK I/O
Abbruch 2. Bei der Ausführung von 1 Anfrage 100mal (Container stürzt nach 30 um)
CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O BLOCK I/O
41fc484677fb 79.00% 891.5 MB/2.147 GB 41.52% 12.13 MB/429.8 kB 2.379 GB/61.85 MB
CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O BLOCK I/O
41fc484677fb 85.83% 892 MB/2.147 GB 41.54% 12.13 MB/429.8 kB 3.071 GB/61.85 MB
CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O BLOCK I/O
41fc484677fb 85.83% 892 MB/2.147 GB 41.54% 12.13 MB/429.8 kB 3.071 GB/61.85 MB
CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O BLOCK I/O
41fc484677fb 86.01% 892 MB/2.147 GB 41.54% 12.13 MB/429.8 kB 3.81 GB/61.85 MB
CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O BLOCK I/O
41fc484677fb 86.01% 892 MB/2.147 GB 41.54% 12.13 MB/429.8 kB 3.81 GB/61.85 MB
CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O BLOCK I/O
41fc484677fb 86.28% 892.2 MB/2.147 GB 41.55% 12.13 MB/429.8 kB 4.508 GB/61.85 MB
CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O BLOCK I/O
41fc484677fb 86.28% 892.2 MB/2.147 GB 41.55% 12.13 MB/429.8 kB 4.508 GB/61.85 MB
CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O BLOCK I/O
CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O BLOCK I/O
CONTAINER CPU % MEM USAGE/LIMIT MEM % NET I/O BLOCK I/O
docker ps -a
zeigt nach dem Absturz
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
41fc484677fb foobar "python service.py" 7 minutes ago Exited (137) 2 minutes ago mycontainer
läuft dmesg zeigt aus Speicherfehler mehrere:
➜ ~ docker exec -it mycontainer dmesg | grep "Out of memory"
Out of memory: Kill process 2006 (python) score 872 or sacrifice child
Out of memory: Kill process 2496 (python) score 873 or sacrifice child
Out of memory: Kill process 2807 (python) score 879 or sacrifice child
Out of memory: Kill process 3101 (python) score 875 or sacrifice child
Out of memory: Kill process 5393 (python) score 868 or sacrifice child
Out of memory: Kill process 5647 (python) score 868 or sacrifice child
Out of memory: Kill process 5926 (python) score 877 or sacrifice child
Out of memory: Kill process 6328 (python) score 873 or sacrifice child
Out of memory: Kill process 7923 (python) score 872 or sacrifice child
Out of memory: Kill process 10183 (python) score 873 or sacrifice child
Frage
Wie kann ich Abstürze wie diese vermeiden?
Dies ist nur auf meinem lokalen Rechner, aber ich plane, diesen Container in die Produktion zu implementieren. Welche Ansätze sollte ich befolgen, um vor Abstürzen zu schützen? Sollte ich mehrere Klone dieses Containers hinter einem Nginx Load Balancer stehen?
In der Produktion plane ich, einzelne Container auf einem einzigen Server auszuführen. Wenn ich einen einzelnen Container auf einem Server ausführen und sonst nichts auf diesem Server ausführen kann, kann der Container dann alle verfügbaren Computerressourcen verwenden?
Der Linux-Kernel hat die Angewohnheit, Prozesse zu beenden, wenn der Arbeitsspeicher knapp wird. Achten Sie auf die Gründe dafür. –
Wenn Sie einen einzelnen Container auf einem einzelnen Server ausführen, warum verwenden Sie einen Contsiner? – dirn