NodeJS web-socket 服务器在大约 1,000 个连接时爆炸式增长

Posted

技术标签:

【中文标题】NodeJS web-socket 服务器在大约 1,000 个连接时爆炸式增长【英文标题】:NodeJS web-socket server explodes at around 1,000 connections 【发布时间】:2015-10-27 07:17:20 【问题描述】:

我正在使用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

【问题讨论】:

一些不错的读物:Nodejs with 1000000 concurrent connections、600k concurrent websocket connections on AWS using Node.js 和 Scaling node.js to 100k concurrent connections。所有这些都来自 Google 搜索“node.js 数千个连接”。 @jfriend00 - 我都读过了。 你能检查 CPU 利用率吗? @Hobbyist - 在阅读和应用这些文章中的所有内容后,您学到、尝试和发现了什么? @jfriend00 - 如果 Daniel 可以在云中的 4 个核心上获得 600,000 个连接,而我无法在具有相同设置和选项的单个核心上获得 1,500 个连接,那么显然某个地方存在问题。跨度> 【参考方案1】:

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

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

如果以上都不是,另一种可能性是您测试创建两个侦听不同套接字的进程。如果能实现这个测试,1K客户端连接一个端口,1K客户端连接另一个端口,就可以判断是系统资源问题还是进程资源问题。

我希望这会有所帮助。

【讨论】:

以上是关于NodeJS web-socket 服务器在大约 1,000 个连接时爆炸式增长的主要内容,如果未能解决你的问题,请参考以下文章

在没有弹簧身份验证的情况下通过 web-socket 多次回复

设计/架构:web-socket 单连接 vs 多连接

Python 在线程类函数中广播更新的 Web-socket 数据

Dart 如何编写一个简单的 web-socket echo 应用程序

Web-Socket

用于双向消息流的 HTTP/2 与 web-sockets