NodeJS网络套接字服务器的连接数量激增至1000个左右



我使用的是websocket/ws,它是使用NodeJS实现web套接字最快的实现之一。然而,在Node决定它已经完成了大部分工作之前,我只能获得大约1000个连接。一旦它达到大约900个连接,它就会变得迟钝,然后停止。

这是我的实现(基本回声服务器):

var wss    = require('ws').Server;
var ws     = require('ws');
var server = new wss({port:8080});
var connections = 0;
server.on('connection', function connection(socket) {
    connections++;
    socket.on('message', function incoming(data) {
        socket.send(data);
    });
    socket.on('close', function ack() {
        connections--;
    });
});
setInterval(function() {
    printConnections();
}, 5000);
function printConnections() {
    console.log("Connected clients: " + connections);
}

服务器显示的连接数量总是等于客户端列出的连接数量,所以这不是问题所在。我曾尝试在不同的网络上使用多台计算机来突破1000用户的限制(看看这是否是家庭网络带宽限制),但事实并非如此。SSH此时也变得高度无响应。

服务器规格:

- 1Gbit ethernet. 
- Three full, dedicated HT CPU cores (Nehalem or better)
- 3072 MB of RAM
- Ubuntu Server 14.04 LTS

当服务器运行时(有1000个用户),仍然有足够的内存可供使用。当我们正在为一个移动应用程序和1000个并发用户开发服务器时,试图弄清楚这里的问题只是触及了表面。我们的目标是同时拥有大约100000名用户。当我们上线时,我们肯定会改进硬件(并获得一台专用机器),但我们应该能够从当前的设置中获得更多。

我还应该补充一点,在试图解决问题时,已经进行了以下修改:

ulimit -n 1000000
sysctl -w fs.file-max = 1000000
sysctl -w fs.nr_open = 1000000  
sysctl -w net.ipv4.netfilter.ip_conntrack_max = 1048576
sysctl -w net.nf_conntrack_max = 1048576

考虑到您的描述,以及ssh和整个系统也受到影响的事实,您一定在某个地方遇到了瓶颈。它既不是CPU,也不是带宽,所以你应该看看内存。发送和接收TCP缓冲区的默认大小是多少?

另一种可能性是,我不知道你测试的环境,如果你正在使用任何像AWS这样的IaaS,或者你在家里用NAT设备(可能是WiFi AP/路由器)进行测试,有时当你试图打开太多连接时,是NAT关闭了你的连接,或者它们在(30-60秒)后超时。如果是这种情况,您可以将ssh客户端配置为每20秒发送一次保持活动消息(我会配置这个时间或更短的时间)。这将解决ssh的问题。此外,在这种情况下,我不相信您能够运行这种测试(使用这种配置)。

另一种可能性是,如果没有上述任何一种,那么您将测试创建两个侦听不同套接字的进程。如果您可以用连接到一个端口的1K客户端和连接到另一端口的1K客户端来实现此测试,那么您就可以确定这是系统资源问题还是仅是进程资源问题。

我希望这能有所帮助。

相关内容

  • 没有找到相关文章

最新更新