我们在Docker容器内部运行1GB,2GB或4GB硬盘内的节点进程。每个容器通常只运行一个单独的Node进程(可能还有一个很小的shell脚本包装器)。为了这个问题的目的,我们假设Node进程永远不会分叉更多的进程。如何确定给定内存限制的节点--max_old_space_size?
对于我们较大的容器,如果我们没有设置--max_old_space_size我们自己,那么在我们使用的节点版本(在64位机器上)defaults to 1400MB。 (这将在更高版本的节点中使用change to 2048MB)。
理想情况下,我们希望我们的节点进程尽可能多地使用容器,而不会导致内存不足。问题是 - 我们应该使用什么数字?我的理解是,这个特定的标记调整了Node使用的最大内存池之一的大小,但它不是唯一的池 - 例如,堆中有“非旧”部分,有堆栈等。我应该在设置此标志时从容器的大小减去,以便远离cgroup内存限制,但仍最大限度地使用此容器中允许的内存量?
我注意到,在定义kMaxOldSpaceSizeHugeMemoryDevice的地方,它看起来像默认的“max semi space”是16MB,默认的“max executable size”是512MB。所以我怀疑这意味着当确定这个标志的值时,我应该从容器的内存限制中减去至少528。但肯定有其他的方式,节点使用内存? (更具体地说,我们是一个托管服务,向我们的用户销售特定大小的容器,其中大部分用于Node进程。我们希望能够告诉我们的客户需要什么标志这样它们既不会被我们的限制所杀,也不会支付我们Node的配置不允许它们实际使用的容量。)
当你说“节点模块”,你的意思是链接在C++代码或其他? –
我的意思是本机模块。任何运行的C++(以及其他非JavaScript)代码都可以分配V8控制之外的内存。 – jmrk