节点js避免了厄运金字塔和内存同时增加

时间:2013-07-21 11:53:50

标签: node.js q node-async

我正在编写一个基于socket.io的服务器,我试图避免the pyramid of doom并保持低内存。 我写了这个客户端 - http://jsfiddle.net/QUDXU/1/我与node client-cluster 1000一起运行。所以1000个连接正在进行连续请求。

对于服务器端,我尝试了3种不同的解决方案。在我让一切运行一小时之后,服务器使用的RAM结果是:

  1. 简单的回调 - http://jsfiddle.net/DcWmJ/ - 112MB
  2. Q模块 - http://jsfiddle.net/hhsja/1/ - 850MB并且正在增加
  3. 异步模块 - http://jsfiddle.net/SgemT/ - 1.2GB并且正在增加
  4. 服务器和客户端位于不同的计算机上。 (Softlayer云实例)。节点0.10.12和Socket.io 0.9.16

    为什么会这样?如何保持低内存并使用某种允许代码保持可读的库?

2 个答案:

答案 0 :(得分:0)

选项1.您可以使用群集模块并不时正常杀死您的工作人员(请确保先断开连接())。你可以查看process.memoryUsage()。rss> 130000000在掌握并杀死工人时超过130MB,例如:)

选项2. NodeJS习惯使用内存,很少进行严格的清理。当V8达到最大内存限制时,GC调用更具攻击性。因此,您可以通过运行node --max-stack-size <amount>来降低节点进程可以占用的最大内存。我在嵌入式设备上运行节点时执行此操作(通常可用的内存少于64 MB)。

选项3.如果您确实希望将内存保持在较低水平,请尽可能使用弱引用(除了长时间运行的调用之外的任何地方)https://github.com/TooTallNate/node-weak。这样,对象将很快收集垃圾。但是,需要进行广泛的测试以确保一切正常。 GL,如果你使用这个:) https://github.com/TooTallNate/node-weak

答案 1 :(得分:0)

似乎问题出在客户端脚本上,而不是服务器脚本上。我运行了1000个进程,每个进程每秒向服务器发送一条消息。我认为服务器正在忙着解决所有这些请求,从而使用所有内存。我重写了客户端,如this,产生了与处理器数量成比例的多个进程,每个进程连接多次,如下所示:

client = io.connect(selectedEnvironment, { 'force new connection': true, 'reconnect': false });

请注意'强制新连接'标志,该标志允许使用相同的socket.io-client实例连接多个客户端。 解决我的问题的部分实际上是如何做出请求:任何客户端在收到前一个请求的确认后一秒钟之后会发出另一个请求,而不是每一秒。 连接1000个客户端使我的服务器使用~100MB RSS。我还在服务器脚本上使用了异步,它看起来非常优雅,比Q更容易理解。 不好的是,我已经运行服务器大约2-3天,内存上升到250MB RSS。这个,我不知道为什么。

相关问题