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

rjm*_*nro 20 docker

当我运行docker时,我收到警告:

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

我想弄清楚这意味着什么,特别是"没有交换的内存限制"这句话.

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

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

dar*_*arw 12

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

/sys/fs/cgroup/memory/memory.limit_in_bytes
/sys/fs/cgroup/memory/memory.memsw.limit_in_bytes
Run Code Online (Sandbox Code Playgroud)

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

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


提到的 cgroup 挂载点可能有所不同,请参阅/proc/self/mounts

  • “选项 --memory-swap 无效” - 你的意思是容器可以使用它想要的所有交换,就像你设置了 `--memory-swap -1` 一样?https://docs.docker.com/config/containers/resource_constraints/#--memory-swap-details 如果您有 2 个需要大量内存的容器,这可能是一个问题 - 它们都会使用大量交换,直到有一个都没有剩下,其中一个会死吗? (2认同)

小智 8

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

尝试设置限制时,您将收到以下错误。

root@ubuntuserver:~# docker container run -d -ti --hostname testcontainer -- name testubuntu2 --restart=always --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"
Run Code Online (Sandbox Code Playgroud)

现在更新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:~#
Run Code Online (Sandbox Code Playgroud)

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

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:~#
Run Code Online (Sandbox Code Playgroud)

  • 是的,但是如果不“修复”这个问题会产生什么后果呢?请回答OP问题:v(我也想知道) (4认同)
  • 另外,为什么默认情况下不这样设置?“修复”这个问题有什么缺点? (2认同)

blu*_*res 6

这是我发现的。

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

您通常可以使用--memory--memory-swap标志来启用和限制交换使用,这就是该警告可以帮助您的地方。来自Docker的文档中有关非常类似的警告的信息:

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

tl; dr:默认禁用交换。如果禁用cgroup或以其他方式破坏了容器交换限制(如该警告所示),则您将无法设置这些限制。

  • 请注意:“即使 Docker 未运行,内存和交换计算也会产生约 1% 的总可用内存的开销,并导致 10% 的整体性能下降。” 因此,如果您确实需要,请启用它。 (4认同)

luc*_*rot 5

docker 安装后文档中说明了修复此警告的一个影响

\n
\n

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

\n
\n
\n

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

\n
\n

这个答案指出

\n
\n

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

\n
\n

在我看来,警告意味着容器仍然可以使用“无限”的内存量。一旦达到施加的--memory=限制,它就会开始交换到交换空间。如果满了,它就会停止。但通过“修复”此警告,我们还可以为其提供有限的交换空间。
\n当我们需要保证其他程序可用的交换空间时,这将很有用。

\n