这个问题之前曾经被问过,但没有得到明确的答案。
使用 Socket.io,是否存在最大并发连接数,在需要添加另一个服务器之前?
有人知道有哪些正在使用 Websockets(特别是 socket.io)大规模生产环境吗?我真的很想知道最适合最大连接数的设置是什么?
因为 Websockets 是建立在 TCP 之上的,所以我理解除非端口在连接之间共享,否则你将受到 64K 端口限制的约束。但我也看到有报道称使用 Gretty 工具实现了 512K 连接。所以我不知道。
这个问题之前曾经被问过,但没有得到明确的答案。
使用 Socket.io,是否存在最大并发连接数,在需要添加另一个服务器之前?
有人知道有哪些正在使用 Websockets(特别是 socket.io)大规模生产环境吗?我真的很想知道最适合最大连接数的设置是什么?
因为 Websockets 是建立在 TCP 之上的,所以我理解除非端口在连接之间共享,否则你将受到 64K 端口限制的约束。但我也看到有报道称使用 Gretty 工具实现了 512K 连接。所以我不知道。
这篇文章可能会帮助您解决问题:http://drewww.github.io/socket.io-benchmarking/
我也曾经想过同样的问题,所以我写了一个小测试(使用XHR-polling),以查看连接何时开始失败(或落后)。我发现(在我的情况下),当并发连接数达到约1400-1800时,套接字开始出现问题。
这是我制作的一个简短Gist,与我使用的测试类似:https://gist.github.com/jmyrland/5535279
我尝试在AWS上使用socket.io,最多只能保持大约600个连接的稳定。
后来我发现这是因为socket.io首先使用长轮询,然后才升级到websocket。
将配置设置为仅使用websocket后,我可以保持约9000个连接。
在客户端设置此配置:
const socket = require('socket.io-client')
const conn = socket(host, { upgrade: false, transports: ['websocket'] })
websocket
(带有nginx反向代理)。我的应用程序在1200个连接后变得无响应。我已经设置了所有的ulimits,但是没有任何作用。 - Sujith S Manjavana在继续之前,请查看此答案的评论。
问题是关于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
了解更多信息,请参考此链接。
sysctl
修改设置之前,请先运行检查,看看是否已将其设置为更高的值。此外,nr_open
具有硬编码内核限制为 1024*1024,因此将其增加超过该值将不会产生任何效果,或者您将收到错误提示。 - venimus这个人似乎成功地让单个Node.js服务器拥有了超过100万个并发连接。
http://blog.caustik.com/2012/08/19/node-js-w1m-concurrent-connections/
但我不确定他使用了多少端口。
我想在2023年提供另一个答案。
我们只在socket.io-client中使用websocket。我们进行了两种性能测试,
我的测试团队使用JMeter测试了高达5000个并发连接。由于我们产品的性质,5000个连接已经足够了,所以我们没有再增加。
我使用https://a.testable.io/做了另一次性能测试。我之所以选择testable(这不是为他们做广告lol),是因为我可以选择来自不同地点的ws客户端,例如我选择了来自北美的3个不同位置和亚洲的一个位置。我认为这比我只是从本地机器运行测试脚本更接近实际情况。进行这种类型的测试需要花费金钱,引用他们技术支持的话,“我看到你今天成功地运行了一个20000用户的测试,太棒了!小于20美元的价格是目前市场上最好的价格:)。”
sysctl -a | grep file