文档说:
在此配置下,当容器消耗的内存大于 200M 且小于 500M 时,下一次系统内存回收会尝试将容器内存缩小到 200M 以下。
但这究竟意味着什么?
假设我有一个运行 Solr 的容器,并且:
docker run -m 1G --memory-reservation 768M solr
当容器开始使用 800M 内存时,对容器内部的 Solr 进程有什么影响?没有影响?
是否仅当内存使用量随后降至 768M 以下时...此标志才允许 docker 从 solr 容器中回收内存?...否则容器将继续消耗最高内存使用量?
这与 Swarm 调度有什么关系?如果 Swarm 总是为容器分配 1G,那么在这种情况下-m
就--memory-reservation
没有用处了?
答案1
该--memory-reservation
选项在容器中设置 cgroup,以确保至少有 800Mb 可以分配给进程。如果是 cgroup_v1,可以在 中找到此值memory.soft_limit_in_bytes
。您可以阅读(过时的)手册在“软限制”部分下。对于 cgroup_v2,此设置可在memory.low
文件中找到。阅读更多内容cgroup_v2 文档。
有关回收过程的更多信息请参见此处:http://linux-mm.org/PageOutKswapd
据我所知,您的 Solr 进程可以使用 800MB,只要没有来自其他 cgroup 的争用,内存就不会被回收。它可以保留内存并使用最多 1GB 的硬限制。如果存在争用,则内核将尝试回收内存,但根据文档的规定soft limits is a best-effort feature.. no guarantees
。