能够比docker构buildmem_limit更多的malloc

我试图限制我的容器,以便它不占用主机上的所有RAM。 从Docker文档我明白, --memory限制了内存和--memory-swap限制(内存+交换)。 从mem_limit -compose文档看来,它们的条款是mem_limitmemswap_limit ,所以我构build了以下memswap_limit -compose文件:

 > 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 

progrium /压力图像只是运行的stress ,在这种情况下产生一个单线程请求15GB的RAM并保持10秒。

我预计这会崩溃,自15> 2。 (如果我要求比主机更多的内存,它会崩溃。)

内核启用了cgroups, docker stats显示这个限制正在被识别:

 > 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 

发生什么了? 我怎么实际限制容器?

更新: free看,看起来RAM的使用是有效的限制(只有1GB的内存使用),但交换不是:容器将逐渐增加交换使用,直到它被吃尽pipe所有的交换和stress崩溃(它需要20秒,以在我的机器上通过5GB的交换)。

更新2:设置mem_swappiness: 0会导致请求更多的内存比mem_limit立即崩溃,不pipememswap_limit

运行docker info显示WARNING: No swap limit support

根据https://docs.docker.com/engine/installation/linux/linux-postinstall/#your-kernel-does-not-support-cgroup-swap-limit-capabilities这是默认禁用(“内存和交换会计费用占总可用内存的1%左右,整体性能下降10%。“)您可以通过编辑/etc/default/grub文件启用它:

添加或编辑GRUB_CMDLINE_LINUX行以添加以下两个键值对: GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"然后使用update-grub更新GRUB并重新引导。