Web服务器可以处理多少个套接字连接?


114

说如果要共享,虚拟或专用托管,我读到某处服务器/机器一次只能处理64,000个TCP连接的情况,这是真的吗?不管带宽如何,任何类型的主机可以处理多少个?我假设HTTP通过TCP起作用。

这是否意味着只有64,000个用户可以连接到该网站,并且如果我想提供更多服务,就不得不转到网络农场?


2
向响应者致歉,我像龙卷风一样穿越了这个话题。我喜欢的答案实在太多,仍然没有直接答案。我经常使用stackoverflow并找到许多高质量的答案。我希望其他人能够找到该线索并找到有用的知情答案。
2015年

大卫,您好,您找到这个问题的正确答案了吗?

通过服务器的单个IP的64000 TCP连接。您可以将您的服务器的网络升级到规模,支持超过64000
艾里

Answers:


108

简而言之:您应该能够实现数百万个同时活动的TCP连接并通过扩展HTTP请求来实现。这告诉您在具有正确配置的正确平台上可以期望的最大性能。

今天,我担心带有ASP.NET的IIS是否会支持100个并发连接(请看我的更新,在较旧的ASP.Net Mono版本上,期望每秒约有1万个响应)。当我看到这个问题/答案时,我忍不住要回答自己,这里很多问题的答案都是完全错误的。

最好的情况

这个问题的答案必须只涉及最简单的服务器配置,以与可能的下游无数变量和配置脱钩。

因此,请考虑以下情况作为我的答案:

  1. 除了保持活动的数据包之外,TCP会话上没有流量(否则,您显然需要相应数量的网络带宽和其他计算机资源)
  2. 设计为使用异步套接字和编程的软件,而不是每个池请求使用的硬件线程。(即带有异步设计的应用程序软件的IIS,Node.js,Nginx ... Web服务器[但不是Apache])
  3. 良好的性能/美元的CPU / Ram。今天,随便说说具有8GB RAM的i7(4核)。
  4. 一个很好的防火墙/路由器来匹配。
  5. 没有虚拟限制/总督-即 Linux somaxconn,IIS web.config ...
  6. 不依赖于其他较慢的硬件-无需读取硬盘,因为这将是最低的公分母和瓶颈,而不是网络IO。

详细答案

相对于异步IO实现,同步线程绑定设计的性能往往最差。

WhatsApp的得到一个亿,在一个单一的Unix交通味OS机- 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。无论使用哪种操作系统和平台,都应该期望异步性能很好。无论选择哪种语言,只要寻找关键字“ asynchronous”,大多数现代语言都将获得某种支持,即使它是某种形式的附加组件。

到WebFarm?

无论您的特定情况有多大的限制,是的,网络农场都是扩展规模的好方法。有许多架构可以实现这一目标。一种是使用负载均衡器(主机提供商可以提供这些负载均衡器,但即使这些负载均衡器也有限制,以及带宽上限),但我不赞成使用此选项。对于具有长时间运行的连接的单页应用程序,我更喜欢有一个服务器的开放列表,客户端应用程序将在启动时从服务器中随机选择,并在应用程序的生命周期内重复使用。这样可以消除单点故障(负载均衡器),并能够扩展多个数据中心,从而增加带宽。

打破神话-64K端口

为了解决有关“ 64,000”的问题部分,这是一个误解。服务器可以连接到超过65535个客户端。参见/networkengineering/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

  • 测试日期:2018-06-06
  • 使用的硬件:Dell R440 Xeon Gold + 10 GbE
  • 领导者每秒约有7M纯文本响应(不响应连接)
  • 用于golang的第二个Fasthttp宣传150万个并发连接-请参阅https://github.com/valyala/fasthttp
  • 领先的语言是Rust,Go,C ++,Java,C,甚至C#排名为11(每秒690万)。Scala和Clojure排名更低。Python以每秒2.7M的速度排名第29位。
  • 在列表的底部,我注意到laravel和cakephp,rails,aspnet-mono-ngx,symfony,zend。全部低于每秒10k。请注意,大多数这些框架都是为动态页面构建的,并且相当老旧,可能会有更新的变体在列表中占据较高的位置。
  • 请记住,这是HTTP纯文本,不是Websocket专业的:许多来这里的人可能会对websocket的并发连接感兴趣。

2
感谢您提供指向人们谈论其工作方式的链接。
里克·史密斯

如果客户端连接的单个服务器出现故障怎么办?而且,如果您所有的SPA都随机连接到一台服务器并使它超载怎么办?使用负载
平衡器

3
客户端将随机选择服务器。所有人随机连接到一个人的机会实际上是不可能的。尽管可能会跟进客户端计数,但是如果服务器太拥挤,服务器可能会要求客户端移至另一台服务器。
托德

1
回复:64K限制-您所说的是正确的,但是服务器应用程序将请求代理到某些后端服务是相当普遍的,在这种情况下,“服务器”现在变成了“客户端”,并且很可能具有担心临时端口耗尽(例如:nginx.com/blog/overcoming-ephemeral-port-exhaustion-nginx-plus)。我确定您知道这一点,但请其他人提及(:
jwd

@jwd好点,对于Web应用程序上的Nginx是上下文相关的,但是对于基本网站,则不需要进行这种代理。Web应用程序也可以通过TCP连接到数据库。从理论上讲,这可以通过使用127。*。*。*范围内的所有地址来解决,但实际上我不知道这是否可用。
托德

54

这个问题是一个相当困难的问题。尽管某些操作系统比其他操作系统受到的限制更大,但计算机对活动连接的数量没有真正的软件限制。问题成为资源之一。例如,假设一台计算机要支持64,000个并发连接。如果服务器每个连接使用1MB的RAM,则它将需要64GB的RAM。如果每个客户端都需要读取文件,则磁盘或存储阵列的访问负载将变得远远超过这些设备所能承受的负载。如果服务器需要为每个连接派生一个进程,则操作系统将花费其大部分时间上下文切换或使进程饿死于CPU时间。

C10K问题页面有这个问题的一个很好的讨论。


3
答案有些复杂。OP似乎是在指最佳情况,包括如何受益,而不是找到最坏的情况,然后指可能有解决方案的文章。注意磁盘瓶颈很有用。使用异步IO可以达到大量并发客户端。
Todd

您怎么能说没有真正的软件限制,因为端口大小本身是16位,这使得在任何时候最大65.5K的最大端口数都不可用。我相信您的回答是不正确的。
2013年

您的机器可以具有1个以上的IP,因此可以使用2 ^ 16个以上的端口。
Arman Ordookhani

8

要在对话中增加我的两分钱,一个进程可以同时打开等于此数字的套接字(在Linux类型系统中)/ proc / sys / net / core / somaxconn

猫/ proc / sys / net / core / somaxconn

可以即时修改此数字(当然,只能由root用户修改)

回声1024> / proc / sys / net / core / somaxconn

但是,这完全取决于服务器进程,机器的硬件和网络,系统崩溃前可以连接的套接字的实际数量。


1
尽管可能适用于Linux,但这是虚拟的限制,而不是可能性的基准。这个答案是针对我的喜好,没有提供任何数目或并发连接数的指示。尽管您付出了很多努力,但它并不是很有用。也许您可以自我回答一个问题:“为什么我在Linux上不能提供超过X个并发TCP连接的服务器”
Todd

2
据我所知这是错误的。somaxconn是打开的套接字上已排队的连接的最大数量(即,它是backlog参数的最大值listen(int socket, int backlog)。它与进程可以打开的套接字的数量无关。)
Timmmm 2015年

8

如果您拥有强大的服务器,并且服务器软件已针对该服务器进行了优化,并且拥有足够的客户端,则答案似乎至少为1200万。如果从一个客户端到一台服务器进行测试,则客户端上的端口号数量将是明显的资源限制之一(每个TCP连接都由源和目标处IP和端口号的唯一组合定义)。

(您需要运行多个客户端,否则首先要达到端口号的64K限制)

归根结底,这是一个见证人的经典例子:“理论与实践之间的差异在实践中要比理论上大得多”-在实践中获得更高的数字似乎是一个循环。提出特定的配置/架构/代码更改; b。测试直到达到极限,c。我吃完了吗 如果没有,则d。找出什么是限制因素,e。返回到步骤a(冲洗并重复)。

这是一个示例,其中有200万个TCP连接到运行Phoenix的强壮的盒子(128GB RAM和40个内核)上http://www.phoenixframework.org/blog/the-road-to-2-million-websocket-connections-它们结束了仅需要50台左右的相当重要的服务器来提供客户端负载(它们的初始较小的客户端已尽早使用,例如“在450k客户端上最大化了我们的4core / 15gb机顶盒”)。

这是本次1000万的参考:http : //goroutines.com/10m

这似乎是基于Java的1200万个连接:https : //mrotaru.wordpress.com/2013/06/20/12-million-concurrent-connections-with-migratorydata-websocket-server/


很棒的新链接,对问题有正确的理解。我喜欢有关撞墙->修复障碍的一般建议。每个人都有不同的具体情况,但至少他们在这里指出了在经济上/实践上可以实现的目标。人们不应该在不久的将来向每台服务器的客户承诺1亿客户。
Todd

5

请注意,HTTP通常不会使TCP连接打开的时间超过将页面传输到客户端所需要的时间。而且用户阅读网页所花的时间通常比下载页面所花费的时间要多得多……当用户查看页面时,他根本没有为服务器增加任何负载。

因此,可以同时查看您的网站的人数远大于它可以同时服务的TCP连接的人数。


12
这根本无法回答问题。无论您说的是什么准确性,在给定的时间仍然会有许多并发的TCP连接,最大值是多少?这是问题的实质。
2014年

3
如果您有值得贡献的东西,Todd一定要继续这样做。
杰里米·弗里斯纳2014年

8
3月28日我已经有了答案,您一定错过了。在具有长轮询和Web套接字连接的单页应用程序的现代世界中,HTTP并不总是短暂的。但是,即使是短暂的,并发连接仍然是最大数量。试图解释这个问题并不是国际海事组织的麻烦。最好将这个答案作为对该问题的注释,它固然有用,但该问题与“套接字连接”有关,而不是与“人”有关。如果需要,关于比率(用户:活动连接)的问题应该是一个单独的问题。
2015年

1
自上个千年以来,浏览器一直在请求HTTP保持活动TCP连接-如果服务器允许连接保持活动状态以及空闲超时时间长短,则取决于服务器。允许保持活动状态可以减少一组请求(例如html页面及其相关资产)的延迟,但是会增加服务器上的资源使用率。
iheggie

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套接字


0

这里有两种不同的讨论:一种是可以连接到您的服务器的人数。别人已经充分回答了这个问题,因此我不再赘述。

其他是您的服务器可以监听多少个端口?我相信这就是64K号码的来源。实际上,TCP协议对端口使用16位标识符,该标识符转换为65536(比64K多一点)。这意味着每个IP地址在服务器上可以有许多不同的“侦听器”。


为了您的利益,我在回答中增加了一个额外部分,以解决您的误解。同样,这个问题是关于“套接字连接”而不是“人”的,这在这个问题的上下文中是重要的区别。
托德

如果我们谈论的是一台服务器服务器和一台路由器,我认为这个答案是正确的。但是@Todd正在占用一台服务器计算机,用户可以通过负载均衡器将其随机连接到其中的任何服务器。
Amr

@amr不正确。我的答案是关于一台机器。“ Webfarm?” 本节提供了更多的对比和建议,并得出结论,对于良好的体系结构,负载均衡器不是必需的。您只是还没有完全阅读我的答案。
Todd

0

我认为一个Web服务器可以处理的并发套接字连接的数量在很大程度上取决于每个连接消耗的资源数量以及该服务器上可用的总资源数量,除非有任何其他Web服务器资源限制配置。

为了说明这一点,如果每个套接字连接消耗1MB的服务器资源,并且服务器具有16GB的可用RAM(理论上),这意味着它将只能处理(16GB / 1MB)并发连接。我认为就这么简单...真的!

因此,无论Web服务器如何处理连接,每个连接最终都会消耗一些资源。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.