Node.js派生的孩子返回消息限制,并绕过它

我在节点上做了一些繁重的统计,所以我将计算分叉到一个subprocess,subprocess将处理所有的mongo查询,并通过数据等循环,最后将结果发送回母进程。 它工作得很好,数据量相对较小。

但是当数据变得足够大的时候,通信似乎被阻塞了,或者在回送过程中出现了问题。 返回的数据是相当大的HighChart对象,它包含了超过200k的数据点,我可以在subprocess调用process.send(data)之前logging消息,并且cpu活动在subprocess中几乎降到0母亲进程的CPU使用率得到了很高的启发,只是呆在那里,并没有下降。 在这一点上,这个过程似乎只是挂起(而不是挂起,因为它仍然响应其他请求),但process.on('message',function(){}); 即使我只是让它坐在那里跑。

IPC可以处理节点的大小是否有限制? 无论如何还是有这个或一些破解呢? 有人build议使用TCP或其他IP协议,而不是IPC,但是这样会使pipe理孩子的生命期有点复杂。

还有没有任何免费的工具,只是使用console.log除了使debugging节点更容易?

提前感谢您的帮助

问候。 G

伙计们,有几个人登陆这个页面,认为它是有用的。

process.send()不使用System V IPC,因此Penryn上面链接到System V消息大小的信息是完全不相关的。

process.send()消息的大小没有根本的限制,除了内存和cpu可用性的创build和json编码/解码这样的消息。 和往常一样,使用node / javascript,JSON.parse()是同步的,因此在JSON数据的非常大的缓冲区上调用它将会阻塞节点。 如果这是一个问题,请将JSON放在pipe道中,然后使用其中一个stream式JSON解码库 – 整体性能会更差,但整体响应性会更好,因为您不会长时间阻止parsing。

如果有人可以find所谓的“消息大小限制”的可复制示例,请在github.com/nodejs/node上向我们报告它的错误

我所见过的所有实例都是用户应用程序代码中的错误。

编辑:似乎我错了。 请参阅Sam的消息: https : //stackoverflow.com/a/40178217/1224279

我原来的答案如下。


当node.js通过IPC发送一个对象时,我相信它被序列化为JSON,发送,然后反序列化。

有邮件大小限制。 根据这个页面 ,对于单个消息来说,限制是8KB,对于Linux,默认情况下是16KB。 你可以通过编辑相应的/proc/sys/kernel文件来改变它。

我不知道这是如何转换为节点(也许它需要照顾一些缓冲),但我猜想有序列化/发送/反序列化200k数据点有一些严重的开销。

你可能有更好的运气发送他们在较小的位。 我发现一个能胜任的系统可以每秒钟parsing大约20k-80k的小型Node.js IPC消息。

如果你发送大量的数据,你必须做到你最终做的事情:在其他地方保存数据并发送它的位置,或使用更适合数据采集(如pipe道 )的不同传输。

编辑:另请参阅: 如何在不使用阻塞stdio的情况下将大数据从/传输到node.js中的subprocess?