NodeJS Web套接字服务器在大约1,000个连接处爆炸

时间:2015-10-27 07:17:21

标签: node.js sockets websocket network-programming

我使用的websocket/ws已知是使用NodeJS的最快的网络套接字实现之一。但是,在Node决定完成所有操作之前,我只能连接大约1,000个连接。一旦它达到大约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);
}

服务器显示的连接数量始终等于客户端列出的连接数量,因此这不是问题所在。我尝试在不同的网络上使用多台计算机来打破1,000个用户限制(看看它是否是家庭网络带宽限制)并且它不是。此时SSH也变得高度反应迟钝。

服务器规格:

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

当服务器运行时(1,000个用户),仍有大量内存可供使用。试图找出问题所在,因为我们正在为移动应用程序和1,000个并发用户的服务器上工作只是表面上的问题。我们的目标是大约100,000个并发用户。当我们上线时,我们肯定会改进硬件(并获得专用机器),但我们应该能够从我们当前的设置中获得更多。

我还应该补充说,在尝试解决问题时已经完成了以下修改:

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

1 个答案:

答案 0 :(得分:1)

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

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

如果不是上述情况,其他可能性是您测试创建在不同套接字上侦听的两个进程。如果您可以通过连接到一个端口的1K客户端和连接到其他端口的1K客户端来实现此测试,则可以确定它是系统资源问题还是仅处理资源。

我希望这会有所帮助。