保持1,000,000个WebSocket连接需要占用多少系统资源?

177

WebSocket很好,但它是否能处理1,000,000个并发连接呢?

保持1,000,000个WebSocket连接需要多少系统资源?

谢谢!

2个回答

247

在当今的系统中,处理一百万个并发TCP连接不是问题。

我可以肯定地说,这是基于我们自己的测试(完全透明:我是Lightstreamer的首席技术官)。

我们必须向一些客户多次证明,单个盒子(而不是超级大型机器)上可以达到100万个连接。但是让我回顾一下我们测试50万个并发连接的配置,因为这是最近在Amazon EC2上执行的测试。

我们在m2.4xlarge实例上安装了Lightstreamer服务器(这是WebSocket服务器等等)。这意味着8个核心和68.4 GiB的内存。

我们启动了11台客户端机器来创建500,000个并发连接到Lightstreamer服务器。测试被配置为从服务器的总出站吞吐量为90,000更新/秒,导致450 Mbit/s的传出带宽峰值。

服务器从未使用超过13 GB的RAM,CPU稳定在60%左右。

有至少30 GB RAM,您可以处理100万个并发套接字。所需的CPU取决于您需要的数据吞吐量。


8
我假设这是某种 Linux 系统。您能否分享有关内核如何进行调整的其他信息?例如最大文件描述符/ TCP 窗口大小等。 - quixver
32
它是标准的Amazon Linux系统。文件描述符数量被增加了。TCP发送缓冲区大小被减小到1600字节(这是由Lightstreamer默认设置的,尽管可以手动调整)。MSS保持默认设置。 - Alessandro Alinone
@AvtandilKavrelishvili:有免费版和付费版。 - Alessandro Alinone
3
通常情况下,定期轮询和长轮询这两种方式会比持久化的websocket连接给服务器带来更多的负载压力。 - Alessandro Alinone
感谢@AlessandroAlinone - Bruno
显示剩余3条评论

92

更新的答案

简短回答: 可以,但成本很高。

详细回答:

这个问题不仅仅适用于WebSockets,因为WebSockets基本上是具有类似HTTP握手和最小分帧消息的长期TCP套接字。

真正的问题是:一个单一的服务器能够处理1,000,000个同时套接字连接,并且这会消耗哪些服务器资源?答案受到多种因素的影响,但在适当大小的系统(大量的CPU、RAM和快速网络)和经过调整的服务器系统和优化的服务器软件下,可以实现1,000,000个同时活动的套接字连接。

连接数不是主要问题(那主要是内核调优和足够的内存问题),而是处理和发送/接收每个连接的数据问题。如果传入的连接在较长时间内分散,并且它们大多处于空闲或者不时发送小块静态数据,那么你可能可以获得比甚至1,000,000个同时连接更高的连接数。然而,即使在这些条件下(缓慢的连接且大部分处于空闲状态),您仍将遇到网络、服务器系统和服务器库无法处理大量连接的配置和设计问题。

有关500,000个连接的近似资源使用情况,请参见Alessandro Alinone的答案。

以下是一些旧但仍然适用的资源,可供阅读,了解如何配置您的服务器并编写支持大量连接的服务器软件:


6
显然,单个JVM可以拥有1200万个套接字连接。看看他们是如何做到的:https://mrotaru.wordpress.com/2013/10/10/scaling-to-12-million-concurrent-connections-how-migratorydata-did-it/ - Jacques Koorts
@JacquesKoorts 谢谢 - Bruno
我认为WebSocket连接总数本身不是问题,内核可以很好地处理10M+的连接。问题在于缓冲(例如,如果您需要将大量数据推送到许多套接字并且客户端没有刷新套接字,则会有大量RAM保留用于传出TCP/IP缓冲区)以及服务器上每个套接字的数据。例如,如果您在服务器上运行Node.js,则需要用于保存与单个连接相关的任何对象的每个连接的总RAM。从理论上讲,人们也可以优化它,但这将是非常昂贵的,因为您需要与Linux内核类似的代码质量。 - Mikko Rantalainen

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