Node.js由于内存不足而被杀死

时间:2016-10-07 10:18:16

标签: node.js memory

我在仅Node.js 512MB RAM的服务器上运行Node.js。问题是当我运行脚本时,它会因内存不足而被杀死。

默认情况下,512MB内存限制为--max-old-space-size。所以我认为使用/var/log/syslog是没用的。

遵循Oct 7 09:24:42 ubuntu-user kernel: [72604.230204] Out of memory: Kill process 6422 (node) score 774 or sacrifice child Oct 7 09:24:42 ubuntu-user kernel: [72604.230351] Killed process 6422 (node) total-vm:1575132kB, anon-rss:396268kB, file-rss:0kB

的内容
SELECT *
FROM   table_name
START WITH "start" = 1
CONNECT BY PRIOR "end" = "start"
INTERSECT
SELECT *
FROM   table_name
START WITH "end" = 5
CONNECT BY PRIOR "start" = "end"

有没有办法在不升级内存的情况下摆脱内存不足? (比如使用持久存储作为额外的RAM)

更新: 它是一个使用节点模块请求和cheerio的刮刀。当它运行时,它将打开数百或数千个网页(但不是并行)

2 个答案:

答案 0 :(得分:0)

如果您正在为可用512的每个最后一兆字节提供节点访问权限,并且仍然不够,那么还有两种方法:

  1. 降低程序的内存要求。这可能是也可能是不可能的。如果您需要此方面的帮助,您应该发布另一个详细说明您的功能和内存使用情况的问题。

  2. 为您的服务器获取更多内存。 512mb并不多,特别是如果您正在运行需要内存存储的其他服务(例如数据库或消息队列)。

  3. 使用swap空间(充当内存备份的磁盘存储)有第三种可能性,但这会对性能产生很大影响。如果你仍然想要它,谷歌如何为你的操作系统设置它,有很多关于这个主题的文章。这是OS配置,而不是Node的。

答案 1 :(得分:0)

古老的问题,但也许这个答案会帮助人们。使用--max-old-space-size并非没有用。

在Nodejs 12之前,版本的堆内存大小取决于操作系统(32或64位)。因此,根据说明,在64位计算机上(仅旧一代计算机)将为1400 MB,而与您的512mb相距甚远。

在Nodejs12中,堆大小负责系统RAM;但是,Nodejs的堆并不是内存中唯一的东西,特别是如果您的服务器不是专用的。因此,将--max-old-space-size许可设置为对旧内存堆有限制,并且如果您的应用程序越来越近,则垃圾收集器将被触发并尝试释放内存。

我写了一篇有关如何观察此情况的文章:https://loadteststories.com/nodejs-kubernetes-an-oom-serial-killer-story/