什么是Docker在说“没有交换的内存限制”时的含义

时间:2018-02-08 12:35:00

标签: docker

我在运行码头时发出警告:

  

警告:您的内核不支持交换限制功能,或者未安装cgroup。没有交换的内存有限。

我正在尝试弄清楚这意味着什么,尤其是短语“没有交换的内存限制。”

这是否意味着容器可以使用比使用主机交换空间通常允许的容量更多的内存?或者它是否意味着即使主机完全耗尽内存,容器也无法使用交换空间?是否配置了交换空间?如果你不使用交换,这是无关紧要的吗?

注意:我对如何修复它并不感兴趣 - 谷歌上有很多关于它的结果。我对的意思感兴趣,以及它为何重要。

6 个答案:

答案 0 :(得分:7)

对于上述问题,我们无法在Ubuntu 16.04上安装Docker 设置限制。这是因为默认情况下cgroups交换是禁用的。

尝试设置限制时,将出现以下错误。

root @ ubuntuserver:〜#docker容器运行-d -ti --hostname testcontainer- 名称testubuntu2 --restart =总是--memory =“ 50m” --memory-swap = 0 --cpus =“ 0.5” ubuntu:16.04 警告:您的内核不支持交换限制功能,或者cgroup是 未安装。内存有限,无需交换。 1fb75aba88e61cf4ca7c96fdd6db939b474d80c0d923233bcb176bf81224dc44 root @ ubuntuserver:〜#

为了解决上述问题,请使用以下条目更新grub文件:

root@ubuntuserver:~# cat /etc/default/grub |grep GRUB_CMDLINE_LINUX
GRUB_CMDLINE_LINUX_DEFAULT="maybe-ubiquity"
GRUB_CMDLINE_LINUX="cgroup_enable=memory swapaccount=1"

现在update-grub:

root@ubuntuserver:~# update-grub
Sourcing file `/etc/default/grub'
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.15.0-74-generic
Found initrd image: /boot/initrd.img-4.15.0-74-generic
done
root@ubuntuserver:~#

完成机器重启并创建具有内存限制的容器:

root@ubuntuserver:~# docker container run -d -ti --hostname testcontainer -- 
name testubuntu2 --restart=always --memory="50m" --memory-swap=0 --cpus="0.5" 
ubuntu:16.04
93969354be0445f3458999259747d82231b4084728c3ccf8801dc89be8aadaa3
root@ubuntuserver:~#

答案 1 :(得分:4)

这是我找到的。

默认情况下不使用交换。您可以在/sys/fs/cgroup/memory/memory.stat的Ubuntu / Debian容器上查看此内容。检查swap value,您会看到它设置为0(字节)。没有交换使用。

您可以enable and limit swap usage通常使用--memory--memory-swap标记,而这里的警告似乎就是这样。来自Docker's documentation关于非常类似的警告:

  

如果您不需要这些功能,则可以忽略该警告。您可以按照这些说明在Ubuntu或Debian上启用这些功能。

tl; dr:默认情况下禁用交换。如果cgroup被禁用或容器交换限制受到影响,如此警告所示,您将无法设置这些限制。

答案 2 :(得分:4)

Docker守护程序依靠以下虚拟文件来实现内存和交换限制:

/sys/fs/cgroup/memory/memory.limit_in_bytes
/sys/fs/cgroup/memory/memory.memsw.limit_in_bytes

如果您的内核不支持交换内存限制,则第二个文件将不存在,并且docker run不会对交换空间的使用施加任何限制。这样,甚至允许容器使用比-m, --memory设置更多的交换,就好像--memory-swap已被设置为-1一样。显然,该容器不能使用比系统上配置的更多的交换空间。

但是,警告消息还试图说明选项-m, --memory仍将生效,并且最大用户内存量(包括文件缓存)将按预期设置。


上述cgroup挂载点可能有所不同,请咨询/proc/self/mounts

答案 3 :(得分:2)

我发现Docker的解决方案如下:

在您的泊坞窗构建计算机上,使用以下条目创建np_height文件:

sysctl.conf

(128是我选择的,你可以相应改变)

接下来在Dockerfile中 - 将以下内容添加到流程中。

vm.nr_hugepages=128 

这会将COPY /folderlocation/sysctl.conf /etc/sysctl.conf 文件复制到docker镜像中的正确目录。

这适用于我的docker XMRig解决方案。

答案 4 :(得分:1)

修复此警告的一个影响在 docker post-install documentation 中说明:

<块引用>

即使 Docker 没有运行,内存和交换计算也会产生大约 1% 的总可用内存开销和 10% 的整体性能下降。

<块引用>

如果您不需要这些功能,可以忽略警告。

This answer 状态

<块引用>

cgroup 交换限制很重要,如果您正在使用交换并且想要强制执行包括内存和交换的内存限制。

对我来说,这听起来像是警告意味着容器仍然可以使用“无限”的内存量。一旦达到强加的 --memory= 限制,它就会开始交换到交换空间。如果它已满,它就会停止。但是通过“修复”这个警告,我们也可以给它有限的交换空间。
在我们需要保证其他程序可用的交换空间的情况下,这会很有用。

答案 5 :(得分:-1)

可能是因为您在此处使用了-m标志:

docker build \
  --build-arg commit_datavana="$commit_sha" \
  --build-arg CACHE_BUST="$(date)" \
  -m 8g \     # hurrrr
  -t "$name_tag" .

如果不需要,可以删除-m标志