docker - 能够分配比docker-compose mem_limit更多的内存

标签 docker malloc docker-compose cgroups

我试图限制我的容器,以便它不会占用主机上的所有RAM。从the Docker docs中我了解到--memory限制了RAM和--memory-swap限制(RAM + swap)。从the docker-compose docs看来,这些术语是mem_limitmemswap_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/

相关文章:

docker - 在 docker-compose 中构建图像时出现多个 Dockerfile 失败

heroku - 更新前先复制目录,编译后再导入。

asp.net - 如何访问在 Docker 中发布的 ASP.NET Swagger API?

c - C 中 malloc() 触发断点

c - C 中的 malloc 和内存泄漏问题

docker - 如何在devops生命周期的开发阶段使用docker?

具有构建输出且无源的 Docker 容器

docker - 如何在gitlab ci上部署quasar-vue应用程序

python - docker python 图像中的 Git 存储库

比较这些二叉树节点实现的空间复杂度?