gpt4 book ai didi

node.js - NodeJS 网络套接字服务器在大约 1,000 个连接时爆炸

转载 作者:搜寻专家 更新时间:2023-11-01 00:00:55 24 4
gpt4 key购买 nike

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

最佳答案

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

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

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

希望对您有所帮助。

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com