众所周知,某些应用程序并不了解Linux内核隔离和虚拟化功能,例如cgroup。这包括top
,free
和ps
等系统工具,还包括Java等平台。
我最近阅读an article,这表明在Kubernetes中运行JVM时,应该对Java堆大小强制执行手动限制以避免错误。
我无法找到NodeJS是否也是如此。我是否需要实现上述内容以在Kubernetes中的NodeJS应用程序上设置--max_old_space_size=XXX
?
答案 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
其他堆空间通常很小且非常静,不用担心。
运行本机代码的模块可以在堆外部分配内存,并且不受选项的限制。