gpt4 book ai didi

docker - Docker 是否应该在所有容器关闭时释放所有内存?

转载 作者:行者123 更新时间:2023-12-02 20:56:52 27 4
gpt4 key购买 nike

我正在调试作为 Docker 网络运行的 Web 服务中可能存在的内存泄漏。该服务有一个 Javascript 前端,Flask REST API,Dask worker 池,spaCy自然语言工具包......作品。我看到间歇性的内存不足问题,我正在尝试了解可能发生的情况。

我可以在我的笔记本电脑上运行这个系统,这是一台 16 GB 内存的 MacBook Pro,我正在使用 Docker Desktop。当没有容器运行时,Activity Monitor 显示 com.docker.hyperkit 使用大约 12 GB。然后我启动 Docker 网络,最终运行 14 个容器来容纳各种组件。我在 Docker 网络中执行了一个相当大的批处理作业。它运行了一个小时,在此期间 com.docker.hyperkit 的内存攀升至大约 18 GB。这并不奇怪——这是一项内存密集型服务。但是当我停止网络中的所有容器时,我希望 com.docker.hyperkit 的内存使用量会回落到 12 GB。相反,它保持在 18 GB。我可以让它恢复到 12 GB 的唯一方法是重新启动 Docker 桌面。

这是预期的行为吗?它看起来像 Docker 中的内存泄漏。

最佳答案

不,它不应该释放内存,是的,这是预期的行为。

无法在 MacOS 上本地运行 docker 容器,因此您可以在虚拟机中运行它们。虚拟机获得分配给它的内存,它分配给在该虚拟机内部运行的进程。当 VM 内的这些进程退出时,资源会释放回 VM,但不会释放回父 MacOS。这就是 VM 的工作方式,它并没有在启动时立即将所有内存占用到 Docker 首选项中指定的限制,这本身就是一个令人印象深刻的壮举。

容器本身就是在这个虚拟机中运行的进程,它们会在退出时将所有内存释放回虚拟机。如果你运行类似 docker run --rm busybox free您可能会看到在 VM 中使用和释放的内存。

有关这方面的更多详细信息,github 问题中有几个广泛的线程。这些线程上的大多数评论似乎来自假设 MacOS 正在运行容器而不是运行容器的 VM 的用户。即使完全空闲,该虚拟机也会使用一些资源来运行内核、容器运行时守护进程、卷共享代码、端口转发代码等。在幕后有很多魔法可以让 docker 在用户看来不像虚拟机,所以您可以只传递路径并连接到 MacOS 端的端口。线程中对我最有帮助的评论在这里:https://github.com/moby/hyperkit/issues/231#issuecomment-448416559

关于docker - Docker 是否应该在所有容器关闭时释放所有内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62459854/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com