【发布时间】:2016-02-03 20:18:45
【问题描述】:
我在 docker 容器中运行 npm,但由于无法分配足够的内存,它经常中止。我看到docker run 命令的--memory (How do I set resources allocated to a container using docker?) 之类的标志似乎限制了容器可以消耗的最大内存量,但还没有看到任何可以让我保留一定数量的容器的内存,如果无法分配则立即中止。
【问题讨论】:
标签: docker
我在 docker 容器中运行 npm,但由于无法分配足够的内存,它经常中止。我看到docker run 命令的--memory (How do I set resources allocated to a container using docker?) 之类的标志似乎限制了容器可以消耗的最大内存量,但还没有看到任何可以让我保留一定数量的容器的内存,如果无法分配则立即中止。
【问题讨论】:
标签: docker
这不是 Linux 下内存管理的工作方式。
如果您运行完全虚拟化,如 QEMU,则可以分配所有内存并将其传递到 VM。然后该虚拟机启动内核,内存由虚拟机中的内核管理。
在 Docker 或任何其他容器/命名空间系统中,内存由运行 docker 的内核和“容器”管理。在容器中运行的进程仍然像正常进程一样运行,但在不同的cgroup 中运行。每个cgroup 都有限制,例如内核将分配给用户空间的内存量,或者它看到的网络接口,但它仍然在同一个内核上运行。
与此类似的是,docker 是“荣耀的ulimit”。低于此限制的进程仍然像正常的 Linux 进程一样运行
就像你不能为 Firefox 预分配内存一样,你也不能为 Docker 容器预分配内存。
【讨论】:
你不能在 docker 中保留内存,只能用 --memory 限制它。
有关详细信息,请参阅:https://docs.docker.com/engine/reference/run/。
具体看用户内存限制部分。
memory=inf, memory-swap=inf (default) >>>> 没有内存限制 容器。容器可以根据需要使用尽可能多的内存。
请注意,这是默认设置。因此,就像系统上的其他进程一样,npm 将使用它可以获得/需要的所有内容。
所以要么释放一些内存,要么添加更多。
【讨论】:
正如其他人所说,您不能为进程保留内存,因此也不能为容器保留内存。但是,您可以通过脚本调用节点应用程序,该脚本将检查可用内存并在低于某个阈值时退出。
【讨论】: