NodeJS 是否尊重 Docker 虚拟化和资源限制?

问题描述 投票:0回答:1

众所周知,某些应用程序不知道 Linux 内核隔离和虚拟化功能(例如 cgroup)。这包括

top
free
ps
等系统实用程序,还包括 Java 等平台。

我最近阅读了一篇文章,其中建议在 Kubernetes 中运行 JVM 时,您应该对 Java 堆大小强制执行手动限制以避免错误。

我无法在任何地方找到 NodeJS 是否也是如此。我是否需要实现类似上面的方法来在 Kubernetes 中的 NodeJS 应用程序上设置

--max_old_space_size=XXX

node.js linux docker linux-kernel kubernetes
1个回答
6
投票

是的,Node.js 12.7+ 将查询当前的 cgroup 限制,并尝试遵守它们。

Node.js v18.18.0 短暂支持 cgroups v2,但看起来它已在 v18.18.1 中恢复。

Node.js v20.3/v20.4 包含支持 cgroups v2 的 libuv 更新。

之前的回答。

NodeJS 进程将尝试分配内存,而不管容器限制如何,就像 Java 一样。

对进程设置限制将有助于阻止操作系统终止进程,特别是在受限环境中,即使 Node 可能在限制范围内运行,Node 也可能会尝试分配超过内存限制的内存。

如果您运行的应用程序接近使用内存限制,则添加内存限制设置只会更改故障场景。 NodeJS 和 JVM 将有机会因内存不足错误 (OOM) 退出,而不是被操作系统杀死。当进程接近内存限制时,该进程可能会缓慢地爬行,并且垃圾收集器会尽力使进程保持在限制以下。

注意old空间只是NodeJS中多个内存空间之一。只能限制新空间(半空间)和旧空间。

--max_semi_space_size (max size of a semi-space (in MBytes), the new space consists of two semi-spaces)
    type: int  default: 0
--max_old_space_size (max size of the old space (in Mbytes))
    type: int  default: 0

其他堆空间通常很小并且足够静态,无需担心。

运行本机代码的模块可以在堆外分配内存,并且不受选项限制。

© www.soinside.com 2019 - 2024. All rights reserved.