我们在一个docker主机上运行多个容器,主要是运行R和Python应用程序进行数据分析。因此,当我将一个大表加载到其中一个容器中时,它在docker主机上的内存占用量就会增加。
但是,当我关闭Jupyter Notebook或R会话时,容器的内存占用似乎在主机上保持不变。似乎docker容器的内存消耗量只能上升,而不是下降。
所以我知道Linux通常会占用其他应用程序不需要的内存(缓存内容)。但是,如何在Docker容器中处理这个问题?从各个容器的角度来看,存在大量内存(我们不想限制容器可用的内存),即使在这个特定容器中不需要它,它也会在容器中保持“占用”状态,并且因此其他容器无法进入。并且主机不知道这个内存是真的需要还是仅仅用于缓存。
那怎么处理?我可以想象一下这样一种情况:几个人已经启动了装载或生成大数据集的容器,但这只是暂时的,现在主机的内存全部被占用,因为内存没有被释放。
我很确定这不是它的工作方式,所以有人可以向我解释一下吗?
非常感谢,
恩诺
答案 0 :(得分:2)
在Docker文档中,在资源限制下,有关于将内存限制为容器的说明。运行容器时,不会根据容器中运行的进程释放内存。文档解释了主机系统如何管理memory:
重要的是不要让正在运行的容器占用过多的主机内存。在Linux主机上,如果内核检测到没有足够的内存来执行重要的系统功能,它会抛出OOME或Out of Memory Exception,并开始终止进程以释放内存。任何进程都会被杀死,包括Docker和其他重要的应用程序。如果错误的进程被杀死,这可以有效地降低整个系统。
Docker尝试通过调整Docker守护程序上的OOM优先级来减轻这些风险,以便它比系统上的其他进程更不可能被杀死...
Docker容器可以使用内存,但Docker守护程序会阻止主机系统崩溃。分配给Docker容器的内存也可以是limited:
Docker可以强制执行硬内存限制,允许容器使用不超过给定数量的用户或系统内存或软限制,这允许容器使用尽可能多的内存,除非满足某些条件,例如,当内核检测到主机上的内存不足或争用时。
我们不希望将内存限制为容器,但有一些选项可以执行此操作,例如--memory=<value>
,--memory-swap
和--memory-reservation
。所以不,主机无法释放正在运行的容器的内存,但它确实可以防止所有内存被占用的风险,并使内核可能会杀死关键的系统进程。
请原谅格式化。希望这可以帮助;我还链接了相关文档。此外,没有完全相关,但也许你可以检查一下在容器中使用Java应用程序:
Why the docker container memory usage doesn't decrease?