使用subprocess时Node.js虚拟内存不断增加

我正在使用spawn-child npm包生成一个shell,在那里我运行一个最初build立在C ++上的二进制文件。 我给Stdin提供了二进制文件,然后这个二进制文件每秒都会发送Stdout。 在节点部分,一旦我开始从二进制接收标准输出,我有一个听众,这将看起来像stdout.on('data', function (data) {}) ,我发送这些数据的SSE通道。

一切工作正常,但主要关注的是我看到当我每次用Stdin打开二进制文件时节点进程的不断的内存增长。 我已经概述了我的代码的外观,是否有一个优雅的方式来控制这个内存的增长,如果是的话,请分享。

 var sseChannel = require('sse-channel'), spawnCommand = require('spawn-command'), cmd = 'path to the binary file', globalArray = [], uuid = require('uuid'); module.exports = function(app) { var child = spawnCommand(cmd), privateChannel = new sseChannel({ historySize: 0, cors: { origins: ['*'] }, pingInterval: 15 * 1000, jsonEncode: false }); srvc = { get: function(req, res) { globalArray[uuid.v4()] = res; child.stdin.write('a json object in a format that is expected by binary' + '\n'); // req.query.<queryVal> child.stdout.on('data', function(data) { privateChannel.send(JSON.stringify(data)); }); }, delete: function(sessionID) { var response = globalArray[sessionID]; privateChannel.removeClient(response); response.end(); delete globalArray[sessionID]; } } } 

这段代码只是为了枚举应用程序的外观。 在这种情况下,运行代码片段不起作用。

我以两个不同的时间间隔收集了heapdump,这就是统计数字,Typed数值有很大的增长,可以做些什么来维持或抑制Typed Array的增长,

在这里输入图像描述

在这里输入图像描述

问题在于你正在产生一个进程,然后为每个请求添加一个新的data事件处理程序到您的http服务器,永远不会被删除。 所以这可以解释为什么内存使用从来没有下降,即使在gc之后。

另一个(不相关的)问题是,如果您使用单个subprocess来处理多个传入请求,则可能会遇到不同请求混合响应的问题(您不能假定一个data事件将包含特定请求的数据)。 如果subprocess是基于node.js的,则可以使用它设置一个ipc通道,然后只传递常规的JavaScript值,而不是设置stdout处理/parsing。 如果孩子不是基于node.js的,或者你想要一个替代(no-ipc)的解决scheme,你可以build立一个队列,所有的请求都被压入,然后有一个处理队列并响应每个请求的函数(只有当你确定你已经接收到当前请求的subprocess的所有输出后,才进入下一个请求)。

如果你的意思是为了subprocess只用于一个请求,你将需要调整你的代码产生一次,而不是每个请求(移动spawn()里面的get() )。