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

时间:2009-10-15 22:22:37

标签: http tcp network-programming hosting tcplistener

如果我要获得共享,虚拟或专用托管,我在某处读取服务器/机器一次只能处理64,000个TCP连接,这是真的吗?无论带宽如何,任何类型的托管处理有多少?我假设HTTP工作在TCP上。

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

8 个答案:

答案 0 :(得分:86)

简而言之: 您应该能够以数百万的同时活动TCP连接和扩展HTTP请求来实现。这可以告诉您使用正确配置的正确平台可以获得的最高性能。

今天,我担心带ASP.NET的IIS是否支持100个并发连接的顺序(查看我的更新,期望在旧的ASP.Net Mono版本上每秒约10k响应)。当我看到这个问题/答案时,我无法抗拒回答自己,这里的问题很多答案都是完全错误的。

最佳案例

这个问题的答案只能关注最简单的服务器配置,以便与下游可能的无数变量和配置分离。

请仔细考虑以下方案:

  1. TCP会话没有流量,除了保持活动数据包(否则你显然需要相应数量的网络带宽和其他计算机资源)
  2. 设计用于使用异步套接字和编程的软件,而不是来自池的每个请求的硬件线程。 (即IIS,Node.js,Nginx ...... webserver [但不是Apache]使用异步设计的应用软件)
  3. 性能良好/美元CPU / Ram。今天,任意地,让我们说i7(4核)与8GB的RAM。
  4. 要匹配的好防火墙/路由器。
  5. 没有虚拟限制/调控器 - 即。 Linux somaxconn,IIS web.config ......
  6. 不依赖于其他较慢的硬件 - 无法读取硬盘,因为它将是最低的公分母和瓶颈,而不是网络IO。
  7. 详细答案

    与异步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

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

答案 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服务器如何处理连接,每个连接最终都会占用一些资源。