1

I am writing a socket.io based server and I'm trying to avoid the pyramid of doom and to keep the memory low. I wrote this client - http://jsfiddle.net/QUDXU/1/ which i run with node client-cluster 1000. So 1000 connections that are making continuous requests.

For the server side a tried 3 different solutions which i tested. The results in terms of RAM used by the server, after i let everything run for an hour are:

  1. Simple callbacks - http://jsfiddle.net/DcWmJ/ - 112MB
  2. Q module - http://jsfiddle.net/hhsja/1/ - 850MB and increasing
  3. Async module - http://jsfiddle.net/SgemT/ - 1.2GB and increasing

The server and clients are on different machines. (Softlayer cloud instances). Node 0.10.12 and Socket.io 0.9.16

Why is this happening? How can I keep the memory low and use some kind of library which allows to keep the code readable?

4

2 回答 2

0

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

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

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

于 2013-07-31T07:47:23.640 回答
0

选项 1。您可以使用集群模块并不时优雅地杀死您的工作人员(确保首先断开连接())。您可以在 master 中检查 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

于 2013-07-23T12:47:24.103 回答