能够使用malloc而不是docker-compose mem_limit

时间:2017-12-05 12:38:35

标签: docker malloc docker-compose cgroups

我正在尝试限制我的容器,以便它不会占用主机上的所有RAM。从the Docker docs我知道--memory限制了RAM和--memory-swap限制(RAM +交换)。从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),但交换不是:容器将逐渐增加交换使用量,直到它被吃掉,尽管所有交换和{{1}崩溃(在我的机器上通过5GB交换需要大约20秒)。

更新2: 设置stress会导致请求的内存超过mem_swappiness: 0时立即崩溃,无论mem_limit如何。

1 个答案:

答案 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并重新启动。