【问题标题】:Maximum concurrent Socket.IO connections最大并发 Socket.IO 连接数
【发布时间】:2013-03-30 03:53:47
【问题描述】:

之前有人问过这个问题,但最近没有问过,而且没有明确的答案。

使用 Socket.io,在您需要添加另一台服务器之前,是否有可以维持的最大并发连接数?

有谁知道任何大规模使用 websockets(尤其是 socket.io)的活跃生产环境?我真的很想知道哪种设置最适合最大连接数?

因为 Websocket 是建立在 TCP 之上的,所以我的理解是,除非在连接之间共享端口,否则您将受到 64K 端口限制的约束。但我也看到了512K connections using Gretty 的报道。所以我不知道。

【问题讨论】:

  • Trello 大规模使用套接字(特别是 socket.io)。
  • 那篇文章有多久了? Trello 最近每月有超过 100 万活跃用户,所以我想他们现在正在运行超过 10,000 个活跃套接字。 Trello use Redis 位于 socket.io 之上以实现可扩展性
  • Trello 现在显然拥有超过 400 万用户,但他们肯定在大量服务器上运行,对吧?这让我回到了最初的问题:他们(或其他任何人)每台服务器的实际峰值并发用户数是多少?知道他们使用什么样的服务器/容器也​​很好。他们还在运行自己的分叉,还是回到原点/主人?我问这个问题的唯一目的是试图评估我的公司(当时)是否有能力为大约 120,000 个并发连接维护一个 Socket.io 应用程序。
  • 关于端口限制,我认为解释了为什么这不是问题的解释here。基本上,系统上使用的唯一端口就是您正在监听的端口。为每个连接创建套接字,这些套接字使用文件描述符,但它们不使用您机器上的端口。
  • 请不要在 RHEL 或 CENTOS 中使用@MajidJafari 答案。由于 /etc/sysctl.conf 损坏,您将无法使用 sudo。这意味着您将无法访问您的 EC2 实例或 PC。我必须分离卷,将备份卷挂载为根卷并编辑 /etc/sysctl.conf 和 /etc/security/limits.conf。如果您知道自己在做什么,请使用他的答案。

标签: websocket socket.io


【解决方案1】:

这篇文章可能会对你有所帮助:http://drewww.github.io/socket.io-benchmarking/

我想知道同样的问题,所以我最终编写了一个小测试(使用 XHR 轮询)来查看连接何时开始失败(或落后)。我发现(就我而言)套接字在大约 1400-1800 个并发连接时开始起作用。

这是我做的一个简短的要点,类似于我使用的测试:https://gist.github.com/jmyrland/5535279

【讨论】:

  • 我意识到这是一个较旧的主题,但我在搜索我的答案的问题时首先发现它并最终发现这很有帮助:rtcamp.com/tutorials/linux/increase-open-files-limit 每个进程的打开文件限制可能默认为软1024 的限制和 4096 的硬限制,并且由于每个打开的 TCP 端口都代表一个文件,因此在尝试最大化库之前确定机器将允许多少个打开的套接字时考虑这些限制非常重要。
  • @JAM 你有没有发现为什么你的网络套接字在 1400-1800 左右的连接中起作用?我有同样的问题,我的文件限制设置为 100,000,所以我知道这不是问题。任何帮助将不胜感激。谢谢。
  • @seth:自从我上次审查这个已经有一段时间了,但我认为这是结论:XHR 轮询占用了太多资源(相对于其他传输方法)。使用 websocket 时,并发连接数更高。
  • @JAM 谢谢你的回答。我在使用 ws 模块而不是 socket.io 时看到了同样的问题,因此不应该使用 ws 模块进行任何 XHR 轮询。那是我在故障排除时遇到问题的地方。搜索继续。
  • 这是一个很好的干净答案.. 根据具体情况也正确.. 我个人建议大家编写自己的基准测试或连接模拟器。虽然对其他人的测试可能很好,但它并不代表真实世界的环境......一旦您拥有一个能够处理具有各种现实世界故障的任意数量的客户端的客户端模拟器......您可以在重大更改后进行基准测试,并且随时更新您的模拟器。操作用户聊天界面与监控用户浏览器等是不同的。Python 我发现编写模拟器脚本非常方便...
【解决方案2】:

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

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

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

在客户端设置此配置:

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

【讨论】:

  • 你用过EC2,哪种实例? t2.micro, t2.nano ?
  • 您在强制使用 websocket 时是否注意到响应能力有所不同?
  • 您知道您的实例的大小吗?同样,将来任何人都知道一些旧浏览器不支持 WebSockets,这就是为什么升级对某些人来说可能很重要。
  • 我们如何测试服务器支持多少连接?你是如何测量 9000 个连接的?请建议..
  • 这个线程是旧的,但是有没有人弄清楚要使用什么样的 EC2 实例?我试图弄清楚要为哪个实例选择:50、100、200 和 300 个并发连接。希望有人会回答。
【解决方案3】:

这家伙似乎成功地在单个 Node.js 服务器上拥有超过 100 万个并发连接。

http://blog.caustik.com/2012/08/19/node-js-w1m-concurrent-connections/

我不清楚他到底使用了多少个端口。

【讨论】:

  • 我认为不适用于 socket.io,甚至不适用于 websockets。这家伙似乎在使用长轮询,我猜这不太需要资源。
【解决方案4】:

在继续之前阅读此答案的评论

关于socket.io sockets的问题,答案是native 插座。这些变化是危险的,因为它们适用于 系统,而不仅仅是 socket.io 套接字。此外,今天的网络是 永远不会成为 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

更多信息请参考this。

【讨论】:

  • 你能编辑你的答案并简单解释一下这里发生了什么吗?
  • 我不能亲自证明这一点,但根据上面@frank 的评论:“请不要在 RHEL 或 CENTOS 中使用(这个)答案。你将无法 sudo由于 /etc/sysctl.conf 损坏。这意味着您将被锁定在 EC2 实例或 PC 之外。我必须分离卷,将备份卷挂载为根卷并编辑 /etc/sysctl.conf 和 /etc/security /limits.conf。如果您知道自己在做什么,请使用他的答案。”
  • 关于 socket.io 套接字的问题,答案是原生套接字。这些更改是危险的,因为它们适用于系统上的所有内容,而不仅仅是 socket.io 套接字。此外,今天的网络从来都不是 socket.io 的瓶颈。 在未了解其含义之前,请勿对您的系统进行这些更改。
【解决方案5】:

配置完成后,可以在终端写这个命令查看

sysctl -a | grep file

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-29
    • 2013-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多