我有一个运行我的用python Flask编写的REST服务的Docker容器.我正在OSx上使用VirtualBox运行容器.
这是容器启动时OSx上的内存统计信息:
因此,我有大约3gb的可用内存.所以我以2 GB的内存限制运行容器
docker run -d -m 2g --name mycontainer -p 5000:5000 foobar
现在,我向容器上运行的服务发送约100个REST请求,同时运行docker stats.
最终,Docker容器崩溃.
我将在容器崩溃之前将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:运行1个请求时,运行100次(容器在30左右后崩溃)
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
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
41fc484677fb foobar "python service.py" 7 minutes ago Exited (137) 2 minutes ago mycontainer
➜ ~ 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负载均衡器后面放置该容器的多个副本?
>在生产中,我计划在单个服务器上运行单个容器.如果我在服务器上运行单个容器,而在该服务器上不运行其他任何容器,那么该容器能够使用所有可用的计算资源吗?
最佳答案
欢迎来到资源的美好世界:)
对容器设置限制并不能使您保持在限制之下,它只是告诉内核何时开始挤压您以及何时杀死您.您实际上必须保持在限制之下.在许多情况下,这意味着您需要注意内存占用情况,并在预算范围内无法满足要求时对请求进行排队或删除.又名甩负荷.
不过,好处是,当您需要更多容器副本时,您现在已经有了一个明确的信号.