我正在使用websocket/ws,它是使用NodeJS的Web套接字的最快可用实现之一。但是,在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个用户),仍然有大量的可用内存。试图弄清楚问题出在哪里,因为我们正在为移动应用程序和1000个并发用户在服务器上工作,这只是表面问题。我们的目标是大约100,000个并发用户。上线时,我们一定会改进硬件(并获得专用的机器),但我们应该能够从当前设置中获得更多 yield 。

我还应该补充一点,在尝试解决此问题时已进行了以下修改:
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秒发送一次保持 Activity 消息(我将配置此时间或更短的时间)。这将解决ssh的问题。另外,在这种情况下,我认为您将无法运行这种测试(使用此配置)。

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

我希望这有帮助。

关于node.js - NodeJS Web套接字服务器爆炸约1,000个,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33361942/

10-13 03:37