Node.js 大量使用后导致子进程死亡

Node.js 大量使用后导致子进程死亡,node.js,phantomjs,child-process,Node.js,Phantomjs,Child Process,我正在执行一个phantomjs脚本大约15000次,针对不同的网页反复执行。我使用的是我自己创建的队列系统,所以使用该方法时我只运行2个进程。(队列如何一次生成/组合,但队列的大小(以度量)仅为20mb左右) 过了一会儿,我的nodejs脚本开始向我抛出以下消息: { [Error: Command failed: /home/ec2-user/bot/node_modules/phantomjs/lib/phantom/bin/phantomjs /home/ec2-user/bot/pha

我正在执行一个phantomjs脚本大约15000次,针对不同的网页反复执行。我使用的是我自己创建的队列系统,所以使用该方法时我只运行2个进程。(队列如何一次生成/组合,但队列的大小(以度量)仅为20mb左右)

过了一会儿,我的nodejs脚本开始向我抛出以下消息:

{ [Error: Command failed: /home/ec2-user/bot/node_modules/phantomjs/lib/phantom/bin/phantomjs /home/ec2-user/bot/phantomjs-script.js http://www.example.com/foo/bar
]
  killed: true,
  code: null,
  signal: 'SIGTERM',
  cmd: '/home/ec2-user/bot/node_modules/phantomjs/lib/phantom/bin/phantomjs /home/ec2-user/bot/phantomjs-script.js http://www.example.com/foo/bar' }
如果我随后重新启动脚本,将从nodejs脚本的开头抛出消息。
如果我注销并重新登录,那么我可以在消息再次出现之前运行更长时间的脚本,就像第一次运行脚本一样

对我来说,这听起来像是内存/堆/垃圾收集问题。但除了确定内存使用量的不同方法外,似乎找不到关于如何处理它的任何信息。结论是脚本使用了非常高的内存量,在20-500 mb之间,用

…这将导致最终抛出此错误:

child_process.js:1155
    throw errnoException(err, 'spawn');
          ^
Error: spawn ENOMEM
    at exports._errnoException (util.js:746:11)
    at ChildProcess.spawn (child_process.js:1155:11)
    at exports.spawn (child_process.js:988:9)
    at Object.exports.execFile (child_process.js:682:15)
    at /home/ec2-user/bot/main.js:66:20
    at worker (/home/ec2-user/bot/main.js:20:9)
    at wrapper [as _onTimeout] (timers.js:265:14)
    at Timer.listOnTimeout (timers.js:110:15)
这个问题解释了这个错误这里的解决方案似乎是消耗你的内存,但我真的不认为我需要超过500 MB的内存来阅读两个网页

我意识到我的问题可能是本地的,不幸的是,我没有代码告诉你我认为问题可能在哪里。对我来说,这一切看起来都很好,而且脚本太大了,不能在这里转储


我对这件事非常迷茫,两天来一直在努力想办法解决,但都没有成功,所以我觉得有必要按照我上面解释的方式询问其他人是否对phanomjs或子进程有问题,如果有,我能做些什么?

你好,Eric,你找到解决这个问题的方法了吗?我只能给你一个不完整的理解和解决方案。不要使用子进程在两者之间进行通信。我正在使用docker并将phantomjs设置为服务器,以便通过简单的http协议在服务之间进行通信。这种方式的效果要好得多,尽管我在一些用于解析和提取内容的3:d party nodejs模块中仍然存在GC问题。为了解决这个问题,我对这个部分使用了一个同步子进程。我还在为逻辑设计一个很好的架构,但是,@Vaviloff如果你遇到任何事情,或者只是想交换一些想法,我很乐意与你多聊。