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 多次回复
Python 在线程类函数中广播更新的 Web-socket 数据