我们在单个 docker 主机上运行多个容器,主要是为了运行 R 和 Python 应用程序进行数据分析。因此,当我将一张大表加载到其中一个容器中时,它在 docker 主机上的内存占用量会增加。
但是,当我关闭 Jupyter Notebook 或 R 会话时,容器的内存占用量在主机上似乎保持不变。看来docker容器的内存消耗只能上升,不能下降。
所以我知道Linux通常占用其他应用程序不需要的内存(东西被缓存)。然而,对于 Docker 容器来说,这是如何处理的呢?从各个容器的角度来看,存在大量内存(我们不想限制容器可用的内存),即使这个特定容器内不需要它,它也会在容器中保持“占用”状态,并且因此其他容器无法访问。并且主机不知道该内存是否真的需要或仅用于缓存。
那么这个情况如何处理呢?我可以想象这样一种情况,几个人启动了容器,在其中加载或生成了大数据集,但这只是暂时的,现在主机的内存都被占用了,因为内存没有被释放。
我很确定这不是它的工作原理,所以有人可以向我解释一下吗?
非常感谢,
恩诺
在Docker文档中,在资源限制下,有关于限制容器内存的解释。运行容器时,不会根据容器中运行的进程释放内存。该文档解释了主机系统如何管理内存:
\n\n\n重要的是不要让正在运行的容器消耗过多的主机\xe2\x80\x99s 内存。在 Linux 主机上,如果内核检测到没有足够的内存来执行重要的系统功能,它会抛出 OOME(内存不足异常),并开始终止进程以释放内存。任何进程都会被杀掉,包括Docker和其他重要的应用程序。如果错误的进程被终止,这可能会导致整个系统瘫痪。
\nDocker 尝试通过调整 Docker 守护进程上的 OOM 优先级来降低这些风险,使其比系统上的其他进程更不可能被杀死......
\n
Docker 容器可以使用内存,但 Docker 守护进程会阻止其导致主机系统崩溃。分配给 Docker 容器的内存也可以受到限制:
\n\n\nDocker 可以强制实施硬内存限制,允许容器使用不超过给定数量的用户或系统内存,也可以实施软限制,允许容器使用所需的内存,除非满足某些条件,例如当内核检测到主机内存不足或争用。
\n
我们不想限制容器的内存,但有一些选项可以这样做,例如--memory=<value>
、--memory-swap
和--memory-reservation
。因此,主机无法释放正在运行的容器的内存,但它确实可以防止所有内存被占用并使内核可能杀死关键系统进程的风险。
请原谅格式。希望这可以帮助; 我还链接了相关文档。另外,不完全相关,但也许您可以查看有关在容器中使用 Java 应用程序的信息:
\n为什么 docker 容器内存使用量没有减少?
归档时间: |
|
查看次数: |
8284 次 |
最近记录: |