2016-04-21 15 views
2

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:

enter image description here

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

  1. Wie kann ich Abstürze wie diese vermeiden?

  2. 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?

  3. 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?

+0

Der Linux-Kernel hat die Angewohnheit, Prozesse zu beenden, wenn der Arbeitsspeicher knapp wird. Achten Sie auf die Gründe dafür. –

+0

Wenn Sie einen einzelnen Container auf einem einzelnen Server ausführen, warum verwenden Sie einen Contsiner? – dirn

Antwort

2

Willkommen in der wunderbaren Welt der Ressourcen :)

eine Grenze auf einem Container Putting Sie unter der Grenze macht nicht bleiben, es sagt nur den Kernel, wenn Sie quetschen zu starten und wenn zu töten Sie. Sie müssen tatsächlich unter Ihrem Limit bleiben. In vielen Fällen bedeutet dies, dass Sie Ihren Speicherbedarf überwachen und Anfragen in die Warteschlange stellen oder ablehnen, wenn Sie sie nicht innerhalb Ihres Budgets erfüllen können. AKA Lastabwurf.

Der Vorteil ist jedoch, dass Sie jetzt ein ziemlich klares Signal haben, wenn Sie mehr Replikate Ihrer Container benötigen.

+0

"In vielen Fällen bedeutet dies, dass Sie Ihren Speicherbedarf überwachen und Anfragen in die Warteschlange stellen oder ablehnen, wenn Sie diese nicht innerhalb Ihres Budgets erfüllen können." Ich nehme an, dass so etwas auf der Anwendungs-/Codeebene erfolgt. Gibt es auch etwas, das den Speicherabdruck überwacht und eine Replik erstellt, bevor der Container abstürzt? Ich denke darüber aus Produktionsperspektive – Anthony

+0

Einige der Lösungen enthalten intern Bibliotheken für Selbstüberwachung und Last-Shedding, mit Steuerungssystemen, die Container als Antwort auf Last wachsen lassen, Steuerungssysteme, die Replikate als Antwort auf Last hinzufügen, und "opportunistisch" Speicherborgen beim Warten auf Kontrollsysteme. –

+0

Ups, drücken Sie Enter. Die kurze Geschichte ist, dass in OSS Land nicht alle diese Dinge für Sie verfügbar sind. Kubernetes verfügt über eine integrierte Unterstützung für die automatische Skalierung von Replikaten als Antwort auf die Auslastung, jedoch nur horizontal. Kubernetes hat auch die Fähigkeit, Container zu beschreiben, die Speicher entlehnen, aber ich glaube nicht, dass das so robust ist, wie wir es uns heute wünschen. Sie brauchen wirklich etwas ganzheitlicheres als einfaches Docker, um Situationen wie diese beherrschbar zu machen, weshalb Kubernetes existiert (nur als ein Beispiel). –

Verwandte Themen