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

Dav*_*vid 101 hosting network-programming tcp tcplistener http

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

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

Tod*_*odd 96

简而言之:您应该能够以数百万个同时活动的TCP连接和扩展HTTP请求的顺序实现.

今天,我担心带ASP.NET的IIS是否支持100个并发连接的顺序.当我看到这个问题/答案时,我无法抗拒回答自己,这里的问题很多答案都是完全错误的.

最佳案例

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

因此,请考虑以下场景作为我的答案:

  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.

详细解答

相对于异步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架构下共享相同的服务器端口.它们各自注册一个单独的域绑定,但最终有一个服务器应用程序将请求代理到正确的应用程序.

  • 感谢您提供指向人们谈论他们如何做的链接。 (4认同)
  • 客户端会随机选择一个服务器.所有随机连接到一个的机会几乎是不可能的.虽然可以跟进客户端数量,但如果过于拥挤,服务器可能会要求客户端移动到另一台服务器. (3认同)
  • 回复:64K 限制 - 你说的是真的,但是服务器应用程序将请求代理到某些后端服务是相当常见的,在这种情况下,“服务器”现在变成了“客户端”,并且很可能有担心临时端口耗尽(例如:https://www.nginx.com/blog/overcoming-ephemeral-port-exhaustion-nginx-plus/)。我相信您知道这一点,但向其他人提及(: (2认同)

Var*_*der 54

这个问题相当困难.虽然某些操作系统比其他操作系统更受限制,但是对于机器可以具有的活动连接数没有真正的软件限制.问题变成了资源之一.例如,假设一台机器想要支持64,000个并发连接.如果服务器每个连接使用1MB的RAM,则需要64GB的RAM.如果每个客户端都需要读取文件,则磁盘或存储阵列访问负载会比那些设备可以处理的大得多.如果服务器需要为每个连接分叉一个进程,那么操作系统将花费大部分时间上下文切换或将进程耗尽的CPU时间.

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

  • 有点混合的答案.OP似乎指的是一个最佳案例场景,包括如何有益,而不是找到最坏的情况,然后参考可能有解决方案的文章.注意磁盘瓶颈很有用.使用异步IO可以访问非常多的并发客户端. (3认同)

Jer*_*ner 7

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

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

  • 这根本没有回答这个问题。不管你所说的是否准确,在给定时间仍然会有多个并发的 TCP 连接,最大值是多少?这是问题的本质。 (15认同)
  • 我已经在 3 月 28 日得到了答复,您一定错过了。在具有长轮询和网络套接字连接的单页应用程序的现代世界中,HTTP 并不总是短暂的。但即使它是短暂的,仍然存在最大并发连接数。试图解释这个问题并不是 IMO 的回答。这个答案最好作为对该问题的评论,它当然有用,但该问题与“套接字连接”有关,而不是“人”。如果需要,关于比率(用户:活动连接)的问题应该是一个单独的问题。 (8认同)
  • 如果你有什么值得贡献的东西,托德,一定要去做。 (4认同)

Abr*_*elo 7

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

cat/proc/sys/net/core/somaxconn

这个数字可以动态修改(当然只有root用户)

echo 1024>/proc/sys/net/core/somaxconn

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

  • 据我所知,这是*错*.somaxconn是打开套接字上排队连接的最大数量(即它是`listen(int socket,int backlog)`的backlog参数的最大值.它与进程可以拥有的套接字数量无关打开. (2认同)

ihe*_*gie 6

看起来答案至少有1200万,如果你有一个强大的服务器,你的服务器软件已经优化,你有足够的客户端.如果从一个客户端测试一个服务器,则客户端上的端口号将是明显的资源限制之一(每个TCP连接由源和目标上的IP和端口号的唯一组合定义).

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

当谈到它时,这是一个典型的例子,说"理论与实践之间的差异在实践中比在理论上要大得多" - 在实践中,实现更高的数字似乎是一个循环.提出具体的配置/架构/代码更改,b.测试它直到你达到极限,c.我完成了吗?如果不是那么d.找出限制因素,e.回到步骤a(冲洗并重复).

这是一个例子,有200万个TCP连接到一个强大的盒子(128GB RAM和40个核心)运行Phoenix http://www.phoenixframework.org/blog/the-road-to-2-million-websocket-connections-他们结束了需要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/