如果我要获得共享,虚拟或专用托管,我在某处读取服务器/机器一次只能处理64,000个TCP连接,这是真的吗?无论带宽如何,任何类型的托管处理有多少?我假设HTTP工作在TCP上。
这是否意味着只有64,000个用户可以连接到该网站,如果我想提供更多服务,我必须转移到网络农场?
答案 0 :(得分:86)
简而言之: 您应该能够以数百万的同时活动TCP连接和扩展HTTP请求来实现。这可以告诉您使用正确配置的正确平台可以获得的最高性能。
今天,我担心带ASP.NET的IIS是否支持100个并发连接的顺序(查看我的更新,期望在旧的ASP.Net Mono版本上每秒约10k响应)。当我看到这个问题/答案时,我无法抗拒回答自己,这里的问题很多答案都是完全错误的。
最佳案例
这个问题的答案只能关注最简单的服务器配置,以便与下游可能的无数变量和配置分离。
请仔细考虑以下方案:
详细答案
与异步IO实现相比,同步线程绑定设计往往表现最差。
WhatsApp在单个Unix风格的操作系统计算机上获得了100万的流量 - https://blog.whatsapp.com/index.php/2012/01/1-million-is-so-2011/。
最后,这个http://highscalability.com/blog/2013/5/13/the-secret-to-10-million-concurrent-connections-the-kernel-i.html进入了很多细节,探讨了如何实现1000万。服务器通常具有硬件TCP卸载引擎,专为此特定角色设计的ASIC比通用CPU更有效。
良好的软件设计选择
异步IO设计在操作系统和编程平台上会有所不同。 Node.js的设计考虑了异步。你应该至少使用Promises,当ECMAScript 7出现时,async
/ await
。 C#/ .Net已经拥有像node.js这样的完全异步支持。无论操作系统和平台如何,异步都应该表现得非常好。无论你选择什么语言,寻找关键词“异步”,大多数现代语言都会有一些支持,即使它是某种附加组件。
到WebFarm?
无论您的特定情况是什么限制,是的,网络农场是扩展的一个很好的解决方案。有许多架构可以实现这一目标。一个是使用负载均衡器(托管服务提供商可以提供这些,但即使这些都有限制,以及带宽上限),但我不赞成这个选项。对于具有长时间连接的单页应用程序,我更愿意拥有一个打开的服务器列表,客户端应用程序将在启动时随机选择这些服务器并在应用程序的生命周期内重用。这样就消除了单点故障(负载均衡器),并可以通过多个数据中心进行扩展,从而实现更多的带宽。
打破神话 - 64K端口
要解决有关“64,000”的问题部分,这是一种误解。服务器可以连接到超过65535个客户端。见https://networkengineering.stackexchange.com/questions/48283/is-a-tcp-server-limited-to-65535-clients/48284
顺便说一下,Windows上的Http.sys允许多个应用程序在HTTP URL架构下共享同一个服务器端口。它们每个都注册一个单独的域绑定,但最终有一个服务器应用程序将请求代理到正确的应用程序。
更新2019-05-30
以下是最快的HTTP库的最新比较 - https://www.techempower.com/benchmarks/#section=data-r16&hw=ph&test=plaintext
答案 1 :(得分:52)
这个问题相当困难。虽然某些操作系统比其他操作系统更受限制,但是对于机器可以具有的活动连接数没有真正的软件限制。问题变成了资源之一。例如,假设一台机器想要支持64,000个并发连接。如果服务器每个连接使用1MB的RAM,则需要64GB的RAM。如果每个客户端都需要读取文件,则磁盘或存储阵列访问负载会比那些设备可以处理的大得多。如果服务器需要为每个连接分配一个进程,那么操作系统将花费大部分时间上下文切换或使用过程占用CPU时间。
C10K problem页面对此问题进行了非常好的讨论。
答案 2 :(得分:6)
要将我的两分钱添加到对话中,进程可以同时打开一些连接的数量等于此数字的套接字(在Linux类型系统中)/ proc / sys / net / core / somaxconn
cat / proc / sys / net / core / somaxconn
此号码可以即时修改(当然只能由root用户修改)
echo 1024>的/ proc / SYS /净/型芯/ SOMAXCONN
但完全取决于服务器进程,机器和网络的硬件,崩溃系统之前可以连接的实际插座数
答案 3 :(得分:6)
如果您拥有一台强大的服务器,您的服务器软件已针对它进行了优化,您拥有足够的客户端,那么看起来答案至少为1200万。如果从一个客户端测试一个服务器,则客户端上的端口号将是明显的资源限制之一(每个TCP连接由源和目标上的IP和端口号的唯一组合定义)。
(您需要运行多个客户端,否则首先达到端口号的64K限制)
当谈到它时,这是一个典型的诙谐主义的例子,理论和实践之间的差异在实践中比在理论上要大得多。 - 实际上,实现更高的数字似乎是一个循环。提出具体的配置/架构/代码更改,b。测试它直到你达到极限,c。我完成了吗?如果不是那么d。找出限制因素,e。回到步骤a(冲洗并重复)。
这是一个示例,在运行Phoenix http://www.phoenixframework.org/blog/the-road-to-2-million-websocket-connections的强大盒子(128GB RAM和40个核心)上有200万个TCP连接 - 他们最终需要50个左右的合理重要的服务器来提供客户端负载(他们的初始小客户最早到达,例如"最大化我们的4核/ 15gb盒子@ 450k客户")。
这是另一个参考,这次是1000万:http://goroutines.com/10m。
这似乎是基于java和1200万个连接:https://mrotaru.wordpress.com/2013/06/20/12-million-concurrent-connections-with-migratorydata-websocket-server/
答案 4 :(得分:4)
请注意,HTTP通常不会使TCP连接保持打开状态,而不是将页面传输到客户端;用户通常需要花费更多的时间来阅读网页而不是下载页面...当用户正在查看页面时,他根本不会给服务器增加任何负担。
因此,可以同时查看您的网站的人数远远大于它可以同时服务的TCP连接数。
答案 5 :(得分:1)
对于IPv4协议,具有一个IP地址只能在一个端口上侦听的服务器只能处理2 ^ 32个IP地址x 2 ^ 16个端口,因此2 ^ 48个唯一的套接字。如果您说服务器是一台物理机,并且能够使用所有2 ^ 16端口,那么一个IP地址最多可以有2 ^ 48 x 2 ^ 16 = 2 ^ 64个唯一的TCP / IP套接字。请注意,某些端口是为操作系统保留的,因此此端口号会更低。总结一下:
1个IP和1个端口-> 2 ^ 48个套接字
1个IP和所有端口-> 2 ^ 64个套接字
Universe中所有唯一的IPv4套接字-> 2 ^ 96套接字
答案 6 :(得分:0)
这里有两个不同的讨论:一个是有多少人可以连接到您的服务器。其他人已经充分回答了这个问题,所以我不打算这样做。
其他是您的服务器可以侦听多少个端口?我相信这是64K号码的来源。实际上,TCP协议使用16位标识符作为端口,转换为65536(略高于64K)。这意味着您可以在每个IP地址的服务器上拥有那么多不同的“侦听器”。
答案 7 :(得分:0)
我认为一个Web服务器可以处理的并发套接字连接数在很大程度上取决于每个连接消耗的资源量以及服务器上可用的总资源量限制任何其他Web服务器资源限制配置。
为了说明,如果每个套接字连接消耗1MB的服务器资源,并且服务器有16GB的RAM可用(理论上),这意味着它只能处理(16GB / 1MB)并发连接。我认为这很简单......真的!
因此,无论Web服务器如何处理连接,每个连接最终都会占用一些资源。