Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Socket.IO+;Node.js+;ZMQ_Node.js_Sockets_Memory Leaks_Socket.io_Zeromq - Fatal编程技术网

使用Socket.IO+;Node.js+;ZMQ

使用Socket.IO+;Node.js+;ZMQ,node.js,sockets,memory-leaks,socket.io,zeromq,Node.js,Sockets,Memory Leaks,Socket.io,Zeromq,我有三份申请书在互相交谈。websocket服务器(1)接受来自浏览器的连接,解析url以查看所需的数据,如果客户端内存中有数据,则将其提供给客户端,如果没有,则从另一个名为“fetcher”的应用程序请求数据(2)。Fetcher接收此作业,从返回JSON数据的简单API(3)请求它,并将其发送回websocker服务器,websocker服务器将其发布到连接的客户端。然后,“Fetcher”开始定期检查该url/作业是否有更新,并在更新时将新数据发送到websocket服务器 我使用sock

我有三份申请书在互相交谈。websocket服务器(1)接受来自浏览器的连接,解析url以查看所需的数据,如果客户端内存中有数据,则将其提供给客户端,如果没有,则从另一个名为“fetcher”的应用程序请求数据(2)。Fetcher接收此作业,从返回JSON数据的简单API(3)请求它,并将其发送回websocker服务器,websocker服务器将其发布到连接的客户端。然后,“Fetcher”开始定期检查该url/作业是否有更新,并在更新时将新数据发送到websocket服务器

我使用socket.io进行客户端websocket服务器通信。Websocket服务器和获取程序通过ZMQ套接字进行对话

我使用130个连接加载测试websocket服务器。Websocket服务器每秒向130个客户端发布160KB的数据。起初,它使用170mb的RAM进行130个连接,但很快就增加到1GB,尽管没有新的连接。然后socket.io的心跳信号开始失效,导致连接中断

我使用Nodetime拍摄堆快照。在第130个客户端连接之后,下面是内存的外观:

346个缓冲对象,总容量44MB

在四分钟内,缓冲区对象的数量急剧增加(同样,没有新的连接):总共有3012个缓冲区对象,总内存486MB。再过10分钟,总共有3535个内存消耗量573MB

我使用Mozilla的memwatch找出哪一行添加到内存中,并发现该函数:

function notifyObservers(resourceId) {
  var data = resourceData[resourceId];
  io.sockets.in(resourceId).emit('data', data);
}
如果我将这些行注释掉,内存使用量保持不变,这是另一个确认

你知道怎么会这样吗?我在ZMQ的订户套接字方法中调用了这个函数,我怀疑它与此有关。。如果删除函数并将其合并为一个函数,则会生成以下代码:

// Receive new resource data
const resourceUpdatedSubscriber = zmq.socket('sub').connect('tcp://localhost:5433');
resourceUpdatedSubscriber.subscribe('');

resourceUpdatedSubscriber.on('message', function (data) {
  var resource = JSON.parse(data);

  resourceData[resource.id] = resource.data;

  io.sockets.in(resourceId).emit('data', resourceData[resource.id]);
});
我所有的代码(包括负载测试)都是公共的,您可以在这里找到这个web套接字服务器:参见第138行

我两个月前开始学习Javascript和Node.js,欢迎发表任何评论,提前感谢

也许可以尝试添加

var resourceData;
在代码中的某个地方,因为内存泄漏可能与全局变量有关


在此处阅读有关globals的更多信息:

NodeJs可能正在使用Windows Socket API(其中包括内存泄漏、旧的已知错误)

问题是,在您关闭网络服务之前,永远不会调用WSACleanup。(混合使用ZMq或NodeJ不会改变这一事实)


现在,随着时间的推移,您将锁定更多的内存页,并且在第一个内存页已满后,这类通知将增加。

这可能不是最终解决方案,但肯定是进一步调查的一个很好的指针:1)2)非常感谢Dawid,确实,这些似乎不是最终解决方案,但它们启发了我。我用这些简单的行再次复制:
resourceUpdatedSubscriber.on('message',function(data){io.sockets.emit('data',data);})重要的一点是:如果我静态地提供相同的数据(即,
var bigData=require('./bigData.json'))
,我没有任何问题。每当我使用来自ZMQ publisher的数据并“发出”它时,我就会有内存问题。仍在处理它…快速更新,提供静态json只会延迟问题。在230分钟时,内存泄漏再次明显。我用Engine.IO()重新实现了应用程序。此问题仍然存在,但这一次用户数超过210(每秒传输35MB数据)。此节点有任何更新吗?自12月以来,节点已堵塞了一些内存泄漏,您是否有任何改进,或者您是否发现并修复了任何特定问题?不确定您的答案是否正确,但参考的要点是一个很好的阅读。资源数据实际上已在该行定义: