当我运行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。
小智 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)
这是我发现的。
交换默认情况下不使用。您可以在Ubuntu / Debian容器上进行检查/sys/fs/cgroup/memory/memory.stat。检查swap值,您将看到它设置为0(字节)。没有交换使用。
您通常可以使用--memory和--memory-swap标志来启用和限制交换使用,这就是该警告可以帮助您的地方。来自Docker的文档中有关非常类似的警告的信息:
如果不需要这些功能,则可以忽略该警告。您可以按照以下说明在Ubuntu或Debian上启用这些功能。
tl; dr:默认禁用交换。如果禁用cgroup或以其他方式破坏了容器交换限制(如该警告所示),则您将无法设置这些限制。
docker 安装后文档中说明了修复此警告的一个影响:
\n\n\n即使 Docker 未运行,内存和交换计算也会产生约 1% 的总可用内存的开销和 10% 的整体性能下降。
\n
\n\n如果您不需要这些功能,则可以忽略该警告。
\n
这个答案指出
\n\n\n如果您正在使用交换并且想要强制执行包括内存和交换的内存限制,则 cgroup 交换限制非常重要。
\n
在我看来,警告意味着容器仍然可以使用“无限”的内存量。一旦达到施加的--memory=限制,它就会开始交换到交换空间。如果满了,它就会停止。但通过“修复”此警告,我们还可以为其提供有限的交换空间。
\n当我们需要保证其他程序可用的交换空间时,这将很有用。
| 归档时间: |
|
| 查看次数: |
19290 次 |
| 最近记录: |