我在仅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的刮刀。当它运行时,它将打开数百或数千个网页(但不是并行)
答案 0 :(得分:0)
如果您正在为可用512的每个最后一兆字节提供节点访问权限,并且仍然不够,那么还有两种方法:
降低程序的内存要求。这可能是也可能是不可能的。如果您需要此方面的帮助,您应该发布另一个详细说明您的功能和内存使用情况的问题。
为您的服务器获取更多内存。 512mb
并不多,特别是如果您正在运行需要内存存储的其他服务(例如数据库或消息队列)。
使用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/