能够比docker构buildmem_limit更多的malloc
我试图限制我的容器,以便它不占用主机上的所有RAM。 从Docker文档我明白, --memory
限制了内存和--memory-swap
限制(内存+交换)。 从mem_limit
-compose文档看来,它们的条款是mem_limit
和memswap_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并重新引导。