最大同时 Socket.IO 连接数

187

这个问题之前曾经被问过,但没有得到明确的答案。

使用 Socket.io,是否存在最大并发连接数,在需要添加另一个服务器之前?

有人知道有哪些正在使用 Websockets(特别是 socket.io)大规模生产环境吗?我真的很想知道最适合最大连接数的设置是什么?

因为 Websockets 是建立在 TCP 之上的,所以我理解除非端口在连接之间共享,否则你将受到 64K 端口限制的约束。但我也看到有报道称使用 Gretty 工具实现了 512K 连接。所以我不知道。


3
Trello在大规模上使用套接字(特别是socket.io)。 - James
1
那篇文章是多久之前的?Trello最近已经达到了每月超过100万活跃用户,所以我想他们现在运行的活动套接字数量肯定超过了10,000个。Trello使用Redis来增强socket.io的可扩展性。Trello使用Redis - James
2
Trello现在显然拥有超过400万用户,但他们肯定是在大量的服务器上运行,对吧?这让我回到了我的最初的问题:他们(或其他任何人)每个服务器的实际峰值并发用户数是多少?还好知道他们使用什么样的服务器/容器。他们是否仍在运行自己的分支,还是回到了原始/主分支?我提出这个问题的唯一目的是试图衡量我公司(当时)是否能够维护一个Socket.io应用程序,可能有120,000个并发连接。 - Andrew
5
关于端口限制,我认为为什么这不是问题的解释在这里中已经说明了。基本上,您系统上使用的唯一端口是您正在侦听的端口。为每个连接创建套接字,这些套接字使用文件描述符,但不使用您计算机上的端口。 - Paul Lynch
3
请不要在RHEL或CENTOS中使用@MajidJafari的答案。由于/etc/sysctl.conf已损坏,您将无法使用sudo命令。这意味着您将被锁定在EC2实例或PC之外。我不得不分离卷,将备份卷挂载为根卷并编辑/etc/sysctl.conf和/etc/security/limits.conf文件。如果您知道自己在做什么,请使用他的答案。 - frank
显示剩余5条评论
6个回答

105

这篇文章可能会帮助您解决问题:http://drewww.github.io/socket.io-benchmarking/

我也曾经想过同样的问题,所以我写了一个小测试(使用XHR-polling),以查看连接何时开始失败(或落后)。我发现(在我的情况下),当并发连接数达到约1400-1800时,套接字开始出现问题。

这是我制作的一个简短Gist,与我使用的测试类似:https://gist.github.com/jmyrland/5535279


8
我明白这个话题比较老,但当我搜索问题时首先找到了它,最终发现这篇文章很有帮助:https://rtcamp.com/tutorials/linux/increase-open-files-limit/。每个进程的打开文件限制可能默认为软限制1024和硬限制4096。由于每个打开的TCP端口代表一个文件,因此在确定一台机器允许多少个打开的套接字之前,考虑这些限制是很重要的,以避免超出库的最大值。 - DeeperID
2
@JAM,你有没有找出为什么你的Web套接字在连接数达到1400-1800时会出现问题?我也遇到了完全相同的问题,而我的文件限制已经设置为100,000,所以我知道那不是问题所在。如果能提供任何帮助将不胜感激。谢谢。 - Seth
1
@seth:我已经有一段时间没有再次审查这个问题了,但我认为这是结论:XHR轮询占用了太多资源(相对于其他传输方法)。使用WebSockets时,并发连接数更高。 - JAM
@JAM,感谢您的回答。我使用ws模块时遇到了相同的问题,而不是socket.io,因此ws模块不应该有任何XHR轮询。这就是我在解决问题时遇到的困难。搜索仍在继续。 - Seth
1
这是一个很好、很干净的答案。同样,它是因情况而异的。个人建议大家编写自己的基准测试或连接模拟器。虽然为别人进行测试可能很好,但它并不代表真实世界的环境...一旦你有了一个客户端模拟器,能够处理各种真实世界的故障和任意数量的客户端,就可以在主要更改后进行基准测试,并随着进展更新你的模拟器。操作用户聊天界面与监视用户浏览器等是不同的...我发现Python非常方便来编写一个模拟器脚本... - Angry 84
嗨,Jam,这不取决于您使用的服务器吗? 您测试的是什么类型的服务器? - user3304007

46

我尝试在AWS上使用socket.io,最多只能保持大约600个连接的稳定。

后来我发现这是因为socket.io首先使用长轮询,然后才升级到websocket。

将配置设置为仅使用websocket后,我可以保持约9000个连接。

在客户端设置此配置:

const socket = require('socket.io-client')
const conn = socket(host, { upgrade: false, transports: ['websocket'] })

15
你使用了 EC2 吗?使用的是哪种实例类型呢?t2.micro,t2.nano? - bvdb
2
当您强制使用WebSockets时,是否注意到响应速度的差异? - Lauren
你知道你的实例是什么大小吗?另外,为了让未来的任何人知道,一些旧浏览器不支持WebSockets,这就是为什么升级对某些人很重要的原因。 - Ryan Soderberg
我们如何测试服务器支持多少连接?你是如何测量9000个连接的?请提供建议。 - Curious Developer
3
这个帖子有些陈旧,但有人确定应该使用什么样的EC2实例了吗?我正在尝试找出适合50、100、200和300并发连接的实例类型。希望有人能回答。 - Rookie
我只使用websocket(带有nginx反向代理)。我的应用程序在1200个连接后变得无响应。我已经设置了所有的ulimits,但是没有任何作用。 - Sujith S Manjavana

20

在继续之前,请查看此答案的评论。

问题是关于socket.io sockets的,而回答则涉及原生sockets。这些更改是危险的,因为它们适用于系统中的所有内容,而不仅仅是socket.io sockets。此外,现今网络从未成为socket.io的瓶颈。在未充分了解其影响之前,请勿对您的系统进行这些更改。

针对+300k并发连接:

/etc/sysctl.conf中设置以下变量:

fs.file-max = 10000000 
fs.nr_open = 10000000

同时,请在/etc/security/limits.conf文件中更改以下变量:

* soft nofile 10000000
* hard nofile 10000000
root soft nofile 10000000
root hard nofile 10000000

最后,在/etc/sysctl.conf中增加TCP缓冲区:

net.ipv4.tcp_mem = 786432 1697152 1945728
net.ipv4.tcp_rmem = 4096 4096 16777216
net.ipv4.tcp_wmem = 4096 4096 16777216

了解更多信息,请参考此链接


4
您能否编辑您的答案并简要解释这里正在发生什么? - Esqarrouth
1
我个人无法证实这一点,但根据@frank的评论:“请不要在RHEL或CENTOS中使用此答案。由于/etc/sysctl.conf已损坏,您将无法sudo。这意味着您将被锁定在EC2实例或PC上。我不得不分离卷,将备份卷挂载为根卷并编辑/etc/sysctl.conf和/etc/security/limits.conf。如果您知道自己在做什么,请使用他的答案。” - Andrew
7
问题询问的是关于Socket.IO套接字,而回答则是针对原生套接字的。这些更改非常危险,因为它们适用于系统上的所有内容,而不仅仅是Socket.IO套接字。此外,现今网络通常不会成为Socket.IO的瓶颈。在了解影响之前,请勿对您的系统进行这些更改。 - Xeos
使用 sysctl 修改设置之前,请先运行检查,看看是否已将其设置为更高的值。此外,nr_open 具有硬编码内核限制为 1024*1024,因此将其增加超过该值将不会产生任何效果,或者您将收到错误提示。 - venimus

18

20
我认为不是用socket.io,甚至也不是用websockets。那个人似乎在使用长轮询,我猜这种方式占用的资源较少。 - Tim 333

3

我想在2023年提供另一个答案。

我们只在socket.io-client中使用websocket。我们进行了两种性能测试,

  1. 我的测试团队使用JMeter测试了高达5000个并发连接。由于我们产品的性质,5000个连接已经足够了,所以我们没有再增加。

  2. 我使用https://a.testable.io/做了另一次性能测试。我之所以选择testable(这不是为他们做广告lol),是因为我可以选择来自不同地点的ws客户端,例如我选择了来自北美的3个不同位置和亚洲的一个位置。我认为这比我只是从本地机器运行测试脚本更接近实际情况。进行这种类型的测试需要花费金钱,引用他们技术支持的话,“我看到你今天成功地运行了一个20000用户的测试,太棒了!小于20美元的价格是目前市场上最好的价格:)。”

顺便提一下,您还可以参考https://ably.com/topic/scaling-socketio,这是我能找到的关于socket.io性能的最新发布文章。
所以总结一下,如果您只使用websocket,5000到10000个并发连接应该不太难实现。

2
在进行配置后,您可以在终端上输入此命令进行检查。
sysctl -a | grep file

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接