我正在尝试限制我的容器,以免占主机上的所有RAM。从Docker文档中,我了解--memory
限制了RAM和--memory-swap
限制(RAM 交换)。从Docker-Compose文档中,看起来像mem_limit
和memswap_limit
的术语,因此我已经构造了以下Docker-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/Rescorm图像仅运行stress
,在这种情况下,它会产生一个线程,该线程请求15GB RAM并保留10秒。
我希望这会崩溃,因为15> 2。(如果我要求的RAM超过主机的话,确实会崩溃。)
内核具有启用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 RAM),但交换不是:尽管所有交换和stress
崩溃,该容器将逐渐增加交换用法,直到食用它(大约需要20秒)通过我的机器上的5GB交换)。
更新2:设置mem_swappiness: 0
在请求内存时立即发生崩溃,而与mem_limit
相比,无论memswap_limit
如何。
运行docker info
显示WARNING: No swap limit support
根据https://docs.docker.com/engine/installation/linux/linux/linux-postinstall/#your-kernel-kernel-does-not-support-support-cgroup-swap-swap-limit-capabilities,这是默认的(默认情况下(内存和交换核算的费用约为可用内存总数的1%的开销,总体性能下降10%。")您可以通过编辑/etc/default/grub
文件来启用它:
添加或编辑GRUB_CMDLINE_LINUX
行以添加以下两个键值对: GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"
然后使用update-grub
更新grub并重新启动。