我试图限制我的容器,以便它不会占用主机上的所有RAM。从the Docker docs中我了解到--memory
限制了RAM和--memory-swap
限制(RAM + swap)。从the docker-compose docs看来,这些术语是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/stress image只是运行
stress
,在这种情况下,它会生成一个请求15GB RAM并保持10秒钟的线程。我希望这会崩溃,因为15> 2。 (如果我要求的RAM超出主机的要求,它将崩溃。)
内核启用了cgroup,并且
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-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并重新启动。
关于docker - 能够分配比docker-compose mem_limit更多的内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47653842/