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

说如果我要共享,虚拟或专用主机,我读了一个服务器/机器一次只能处理64,000个TCP连接,这是真的吗? 无论带宽多less,任何types的主机都可以处理? 我假设HTTP在TCP上工作。

这是否意味着只有64,000个用户可以连接到该网站,如果我想提供更多的服务,我将不得不迁移到一个networking农场?

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

今天,我担心IIS和ASP.NET是否会支持100个并发连接。 当我看到这个问题/答案时,我忍不住回答自己,对这个问题的许多答案是完全错误的。

最好的案例

这个问题的答案只能关注最简单的服务器configuration,从无数的variables和可能的下游configuration中分离出来。

所以考虑下面的情况为我的答案:

  1. TCP会话没有stream量,除了保活分组(否则你显然需要相应数量的networking带宽和其他计算机资源)
  2. 软件devise为使用asynchronous套接字和编程,而不是每个池中的请求硬件线程。 (即IIS,Node.js,Nginx … web服务器[但不是Apache]与asynchronousdevise的应用程序软件)
  3. 良好的性能/美元的CPU / RAM。 今天,任意地,我们说i7(4核心)与8GB内存。
  4. 一个好的防火墙/路由器匹配。
  5. 没有虚拟限制/州长 – 即。 Linux somaxconn,IIS web.config …
  6. 不依赖其他较慢的硬件 – 不从硬盘读取数据,因为这将是最低的共同点和瓶颈,而不是networkingIO。

详细的答案

同步线程绑定devise往往是相对于asynchronousIO实现来说性能最差的。

WhatsApp在单一的Unix操作系统机器上获得了百万的stream量 – 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卸载引擎,为此特定angular色devise的ASIC比通用CPU更有效。

良好的软件deviseselect

操作系统和编程平台的asynchronousIOdevise将有所不同。 Node.jsdevise时考虑到asynchronous 。 你至less应该使用Promise,当ECMAScript 7出现时, async / await 。 C#/ .Net已经具有像node.js的完全asynchronous支持。 无论操作系统和平台如何,预计asynchronous操作都会performance的很好。 无论你select什么语言,都要寻找关键字“asynchronous”,大多数现代语言都会有一些支持,即使它是某种附加的。

到WebFarm?

无论您的具体情况有什么限制,是的networking农场是一个很好的解决scheme。 实现这个目标有很多架构。 一个是使用负载平衡器(托pipe服务提供商可以提供这些,但即使这些也有一个限制,以及带宽上限),但我不赞成这个选项。 对于具有长时间运行连接的单页面应用程序,我倾向于使用一个打开的服务器列表,客户端应用程序将在启动时随机select并在应用程序的整个生命周期中重新使用。 这样可以消除单点故障(负载平衡器),并可以通过多个数据中心进行扩展,从而实现更多的带宽。

破除神话 – 64K端口

为了解决“64,000”的问题部分,这是一个误解。

TCP端口字段是2个字节,可以容纳65536个数量,但是这并不限制客户端的数量为〜64k。 每个TCP数据包有两个端口字段,一个用于目的地,另一个用于源(以及两个IP地址)。

使用TCP:

  • 一个服务器监听一个端口,比如80(Web)(目的端口)
  • 让我们假设服务器只监听单个端口上的单个IP地址
  • 每个连接的客户端根据其源IP +端口映射连接状态(并回应)。
  • 每当服务器从同一个IP +端口接收到另一个数据包,它就知道(忽略伪造数据包)它来自同一个客户端端点。

这意味着客户端可以连接的服务器数量 (每个客户端的IP地址)只有一个限制,而不是相反(不是一个服务器可以连接多less个客户端)。

理论上,在单个接收端口上(忽略许多其他实际的限制),服务器可以在单个端口上侦听每个互联网IP地址以及该IP地址的每个端口 – 对于IPv4, 2 ^ 32 * 2 ^ 16(实际上,您需要减去一些保留的IP块和端口范围)。 那些客户端反过来将没有更多的端口连接到互联网上的任何其他服务器。

顺便说一下,Windows上的Http.sys允许多个应用程序在HTTP URL模式下共享相同的服务器端口。 他们每个注册一个单独的域绑定,仍然有一个单一的服务器应用程序代理请求正确的应用程序。

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

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

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

cat / proc / sys / net / core / somaxconn

这个号码可以在飞行中修改(当然只能由root用户修改)

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

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

请注意,HTTP通常不会保持TCP连接打开的时间长于将页面传输到客户端所需的时间; 并且用户阅读网页通常需要更多的时间,而不是下载页面的时间…而在用户正在查看页面时,他根本没有向服务器添加负载。

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

如果你有一个强大的服务器,你的服务器软件为它做了优化,你有足够的客户端,看起来答案是至less1200万。 如果从一台客户机到另一台服务器进行testing,则客户机上的端口号将成为明显的资源限制之一(每个TCP连接由源和目标的IP和端口号的唯一组合来定义)。

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

当谈到这一点时,这是一个典型的例子:“理论与实践的差距在实践上比在理论上要大得多” – 在实践中,实现更高的数字似乎是一个循环。 提出具体的configuration/体系结构/代码更改,b。 testing它,直到你达到极限,c。 我吃完了吗? 如果不是那么d。 弄清楚什么是限制因素, 回到步骤a(冲洗并重复)。

这里有一个200万个TCP连接的例子,运行在一个健壮的盒子上(128GB RAM和40个核心),运行Phoenix http://www.phoenixframework.org/blog/the-road-to-2-million-websocket-connections – 他们结束了为了提供客户端的负载(他们最初的小型客户端已经达到了最初的状态,例如“最大化了我们的4core / 15gb盒子@ 450k客户端”),需要大约50台合理有效的服务器。

这次是另外一个参考,这次是1000万: http : //goroutines.com/10m 。

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

这里有两个不同的讨论:一个是有多less人可以连接到你的服务器。 这个已经被其他人充分的回答了,所以我不会进去的。

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