我正在尝试限制我的容器,以便它不会占用主机上的所有RAM。从the Docker docs我知道--memory
限制了RAM和--memory-swap
限制(RAM +交换)。从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),但交换不是:容器将逐渐增加交换使用量,直到它被吃掉,尽管所有交换和{{1}崩溃(在我的机器上通过5GB交换需要大约20秒)。
更新2:
设置stress
会导致请求的内存超过mem_swappiness: 0
时立即崩溃,无论mem_limit
如何。
答案 0 :(得分:0)
正在运行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并重新启动。