众所周知,某些应用程序不了解 Linux 内核隔离和虚拟化功能(例如 cgroup)。这包括系统实用程序,例如top
, free
and ps
,还有 Java 等平台。
我最近读过一篇文章 https://very-serio.us/2017/12/05/running-jvms-in-kubernetes/这表明在 Kubernetes 中运行 JVM 时,您应该对 Java 堆大小进行手动限制以避免错误。
我无法在任何地方找到 NodeJS 是否也是如此。我是否需要实现类似上面的东西来设置--max_old_space_size=XXX
在 Kubernetes 中的 NodeJS 应用程序上?
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
其他堆空间通常很小并且足够静态,无需担心。
运行本机代码的模块可以在堆外部分配内存,并且不受选项限制。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)