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

时间:2017-12-07 21:52:36

标签: node.js linux docker linux-kernel kubernetes

众所周知,某些应用程序并不了解Linux内核隔离和虚拟化功能,例如cgroup。这包括topfreeps等系统工具,还包括Java等平台。

我最近阅读an article,这表明在Kubernetes中运行JVM时,应该对Java堆大小强制执行手动限制以避免错误。

我无法找到NodeJS是否也是如此。我是否需要实现上述内容以在Kubernetes中的NodeJS应用程序上设置--max_old_space_size=XXX

1 个答案:

答案 0 :(得分:3)

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

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

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

请注意,旧空间只是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

其他堆空间通常很小且非常静,不用担心。

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