我有一個docker容器,它運行用python Flask編寫的REST服務。我在OSx上使用VirtualBox運行容器。爲什麼docker在高內存使用率時崩潰?
這是在OSX上的內存統計信息在容器啓動時:
所以,我有3GB〜可用內存。所以,我跑我的容器2 GB
docker run -d -m 2g --name mycontainer -p 5000:5000 foobar
的內存限制,現在我送〜100個REST請求到容器上運行,而在同一時間運行docker stats
服務。
最終,碼頭容器崩潰。
在容器崩潰之前,我正在粘貼來自docker stats
以下的數據。
崩潰1:當運行100個不同的請求(容器崩潰幾乎瞬間
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
崩潰2:大約30之後當運行1個請求100倍(容器崩潰)
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
在碰撞後顯示以下內容
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
41fc484677fb foobar "python service.py" 7 minutes ago Exited (137) 2 minutes ago mycontainer
運行的dmesg顯示了幾個內存不足的錯誤:
➜ ~ 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
問題
我怎樣才能避免這樣的事故?
這只是在我的本地機器上,但最終我打算將此容器部署到生產中。我應該遵循什麼方法來防止崩潰?我應該將這個容器的多個克隆放在Nginx負載均衡器後面嗎?
在生產中,我計劃在單個服務器上運行單個容器。如果我在服務器上運行單個容器,並且不在該服務器上運行其他任何內容,容器是否能夠使用所有可用的計算資源?
如果內核內存不足,Linux內核就有殺死進程的習慣。找出它的原因。 –
如果您在單個服務器上運行單個容器,爲什麼使用contsiner? – dirn