如果我考虑选择共享、虚拟或独立主机,我从某处了解到一台服务器/计算机在同一时间只能处理64,000个TCP连接,这是真的吗?不考虑带宽,任何类型的主机可以承载多少连接?我假设HTTP是基于TCP协议的。
这是否意味着只有64,000个用户可以连接到网站,如果我想提供更多连接,就必须转移到Web Farm上?
如果我考虑选择共享、虚拟或独立主机,我从某处了解到一台服务器/计算机在同一时间只能处理64,000个TCP连接,这是真的吗?不考虑带宽,任何类型的主机可以承载多少连接?我假设HTTP是基于TCP协议的。
这是否意味着只有64,000个用户可以连接到网站,如果我想提供更多连接,就必须转移到Web Farm上?
良好的软件设计选择
异步IO设计会因操作系统和编程平台而异。Node.js是以异步为设计思路。您应该至少使用Promise,并在ECMAScript 7推出后使用async
/await
。C#/.Net已经像node.js一样完全支持异步。无论选择哪个操作系统和平台,异步都应该表现非常好。无论选择哪种语言,都应该寻找“异步”关键字,大多数现代语言都会提供一些支持,即使是某种添加组件。
对WebFarm?
无论你的特定情况有什么限制,使用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模式下共享同一个服务器端口。它们各自注册单独的域绑定,但最终只有一个服务器应用程序将请求代理到正确的应用程序。这是一个相当困难的问题。实际上,机器能够拥有的活动连接数量并没有真正的软件限制,尽管某些操作系统的限制比其他操作系统更为严格。问题变成了资源的问题。例如,假设单个机器想要支持64,000个同时连接。如果服务器每个连接使用1MB的RAM,则需要64GB的RAM。如果每个客户端都需要读取文件,则磁盘或存储阵列访问负载比这些设备可以处理的要大得多。如果服务器需要为每个连接fork一个进程,那么操作系统将花费大量时间进行上下文切换或使进程饿死。
C10K问题页面对此问题进行了非常好的讨论。
补充一下,一个进程可以在 Linux 系统中同时打开等于此数字的已连接套接字数量的多个套接字(/proc/sys/net/core/somaxconn)。
cat /proc/sys/net/core/somaxconn
此数字可以即时更改(当然只能由 root 用户更改)。
echo 1024 > /proc/sys/net/core/somaxconn
但是,真正可以连接到系统之前崩溃的套接字数量完全取决于服务器进程、机器硬件和网络。
listen(int socket, int backlog)
函数中 backlog 参数的最大值)。它与进程可以打开的套接字数量无关。 - Timmmm如果你有一台强大的服务器,你的服务器软件进行了优化,并且你有足够的客户端,那么答案至少是1200万。如果你从一个客户端测试到一个服务器,客户端上的端口号数量将是明显的资源限制之一(每个TCP连接都由源IP和端口号以及目标IP和端口号的独特组合来定义)。
(你需要运行多个客户端,否则你首先会遇到64K端口号限制)
归根结底,这是一个经典的机智格言的例子,“理论和实践之间的差距在实践中比在理论中更大” - 在实践中,实现更高的数字似乎是一个循环过程:a.提出具体的配置/架构/代码更改,b.测试直到达到极限,c.我完成了吗?如果没有,那么d.确定是什么因素限制了,e.回到步骤a(反复操作)。
这里有一个例子,使用2百万个TCP连接连接到一台强大的服务器(128GB RAM和40个核心),运行Phoenix http://www.phoenixframework.org/blog/the-road-to-2-million-websocket-connections - 他们最终需要50多个相当显著的服务器来提供客户端负载(他们最初的较小客户端很快达到极限,例如“在4核/15GB的服务器上达到45万客户端的极限”)。
这里是另一个参考,这次是使用Go语言实现10百万个连接: http://goroutines.com/10m。
这似乎是基于Java的,并且支持12百万个连接:https://mrotaru.wordpress.com/2013/06/20/12-million-concurrent-connections-with-migratorydata-websocket-server/
对于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个套接字
宇宙中所有唯一的IPv4套接字-> 2^96个套接字
这里有两个不同的讨论:一个是有多少人可以连接到您的服务器。这个问题已经得到其他人的充分回答,所以我不会深入探讨。
另一个是您的服务器可以监听多少个端口?我相信这就是64K数字的来源。实际上,TCP协议使用16位标识符来表示一个端口,这相当于65536(略大于64K)。这意味着您可以在每个IP地址上拥有那么多不同的“监听器”。
我认为一个Web服务器可以处理的并发套接字连接数量在很大程度上取决于每个连接消耗的资源量以及服务器上可用的总资源量,除非有其他Web服务器资源限制配置。
举个例子,如果每个套接字连接消耗1MB的服务器资源,并且服务器有16GB的可用RAM(理论上),这意味着它只能处理(16GB / 1MB)并发连接。我认为这就是这么简单...真的!
因此,无论Web服务器如何处理连接,每个连接最终都会消耗一些资源。