Docker说“内存受限,不允许交换”是什么意思

iswrvxsc  于 2022-11-22  发布在  Docker
关注(0)|答案(7)|浏览(240)

运行Docker时收到警告:
警告:您的内核不支持交换限制功能,或者cgroup没有装入。内存在没有交换的情况下受到限制。
我试图弄清楚这是什么意思,特别是短语“内存有限,没有交换”。
这是否意味着container可以使用比您通常允许的主机交换空间更多的内存?或者这是否意味着container不能使用交换空间,即使主机内存完全用完了?这是否是由于没有配置交换空间造成的?如果您不使用交换空间,这是否无关紧要?
注意:我对如何修复它不感兴趣--谷歌上有很多关于它的搜索结果。我感兴趣的是它的 * 含义 *,以及为什么它很重要。

cczfrluj

cczfrluj1#

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

zxlwwiss

zxlwwiss2#

这是我的发现。
默认情况下不使用Swap。你可以在Ubuntu/Debian容器的/sys/fs/cgroup/memory/memory.stat中检查这个。检查swap value,你会看到它被设置为0(字节)。没有使用swap。
通常,您可以使用--memory--memory-swap标志启用和限制交换空间的使用,这里是这个警告似乎会给您带来的好处。
如果您不需要这些功能,您可以忽略警告。您可以按照以下说明在Ubuntu或Debian上启用这些功能。
tl;dr:swap在默认情况下是禁用的。如果cgroup被禁用或者容器交换限制被破坏,就像这个警告指出的那样,你将无法设置这些限制。

cx6n0qe3

cx6n0qe33#

对于以上问题,我们无法在Ubuntu 16.04上安装Docker。这是因为cgroups交换在默认情况下是禁用的。
尝试设置限制时,将出现以下错误。
root@ubuntuserver:~# docker container运行-d -ti --主机名测试容器--名称测试容器2--重新启动=始终--内存=“50 m”--内存交换=0 --CPU =“0.5”ubuntu:16.04警告:您的内核不支持交换限制功能,或者cgroup未装入。内存在没有交换的情况下受到限制。1fb 75 aba 88 e61 cf 4ca 7 c96 fdd 6db 939 b474 d80 c 0 d923233 bcb 176 bf 81224 dc 44 root@ubuntuserver:~#
要解决上述问题,请使用以下条目更新grub文件:

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

现在更新-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:~#
hc2pp10m

hc2pp10m4#

我发现Docker的解决方案如下:
在您的Docker构建计算机上,创建一个包含以下条目的sysctl.conf文件:

vm.nr_hugepages=128

(128是我选择的,您可以进行相应的更改)
接下来在您的Dockerfile中-将以下内容添加到流程中。

COPY /folderlocation/sysctl.conf /etc/sysctl.conf

这会将sysctl文件复制到Docker映像中的正确目录中。
这适用于我的Docker XMRig解决方案。

e0bqpujr

e0bqpujr5#

docker post-install documentation中说明了修复此警告的一个影响:
内存和交换记帐会产生大约1%的总可用内存开销和10%的总体性能下降,即使Docker没有运行。
如果您不需要这些功能,可以忽略警告。
This answer状态
如果您正在使用swap并希望强制执行包括内存和swap内存限制,则cgroup swap限制非常重要。
在我看来,这个警告意味着一个容器仍然可以使用“无限”的内存。一旦它达到了强加的--memory=限制,它就开始交换空间。如果空间已满,它就停止。但是通过“修复”这个警告,我们也可以给予它有限的交换空间。
这在我们需要保证其他程序的可用交换空间的情况下也很有用。

vql8enpb

vql8enpb6#

如果你 * 不 * 使用交换,只是关心RAM限制,我可以确认,在ubuntu18.04上,一旦达到指定的内存限制,容器内的进程将被杀死,即使没有内核设置。
在我的测试中,我在容器中与其正常进程一起执行,并运行一些内存密集型的进程,只有大进程被杀死:我希望整个容器重新启动。这是在Docker群中使用合成文件中设置的资源限制。
我不知道cgroup_enable=memory是否会在某种程度上使这一点更好...也许它会使容器中所有进程的组合内存作为一个组被更有效地监视?

rqcrx0a6

rqcrx0a67#

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

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

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

相关问题