web服务器可以处理多少个套接字连接?(代码片段)

author author     2022-12-29     645

关键词:

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

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

答案

简而言之:您应该能够以数百万个同时活动的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。

详细解答

相对于异步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的并发连接感兴趣。
另一答案

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

C10K problem页面对此问题进行了非常好的讨论。

另一答案

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

cat / proc / sys / net / core / somaxconn

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

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

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

另一答案

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

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

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

这是一个有200万个TCP连接到一个运行Phoenix http://www.phoenixframework.org/blog/the-road-to-2-million-websocket-connections的强大盒子(128GB RAM和40个核心)上的例子 - 他们最终需要50个左右的合理重要的服务器才能提供客户端负载(他们最初的小客户端最大化到早期,例如“maxed我们的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/

另一答案

请注意,HTTP通常不会使TCP连接保持打开状态,而不是将页面传输到客户端;用户通常需要花费更多的时间来阅读网页而不是下载页面...当用户正在查看页面时,他根本不会给服务器增加任何负担。

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

另一答案

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

另一答案

这里有两个不同的讨论:一个是有多少人可以连接到您的服务器。其他人已经充分回答了这个问题,所以我不打算这样做。

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

另一答案

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

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

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

Web 服务器可以维护多少个 SSE 连接?

】Web服务器可以维护多少个SSE连接?【英文标题】:HowmanySSEconnectionscanawebservermaintain?【发布时间】:2019-04-0717:44:29【问题描述】:我正在尝试使用服务器发送事件(SSE)作为websocket的替代方案,用于实时数据推送(我的应用程序中... 查看详情

linux下的socket编程(代码片段)

... 套接字(socket)是一种通信机制,凭借这种机制,客户/服务器系统的开发工作既可以在本地单机上进行,也可以跨网络进行。Linux所提供的功能(如打印服务、连接数据库和提供Web页面)和网络工具(如用于远程登录的rlogin和... 查看详情

Socket.io:WebSockets 可以处理多少并发连接?

...道你是否有任何关于websockets并发连接的数据?我在Node.js服务器上使用Socket.io。有多少客户端可以连接到套接字并接收数据而不会关闭我的服务器?1000?1 查看详情

可能有多少个套接字连接?

...】:2010-10-1316:38:19【问题描述】:有谁知道现代标准Linux服务器上可能有多少个tcp-socket连接?(通常每个连接上的流量较少,但所有连接都必须一直处于运行状态。)【问题讨论】:对于Windows,看这个问题[Windows并发tcp/ip连接的... 查看详情

套接字及通信(代码片段)

socket():先从服务器端说起。服务器端先初始化Socket,然后与端口绑定(bind),对端口进行监听(listen),调用accept阻塞,等待客户端连接。在这时如果有个客户端初始化一个Socket,然后连接服务器(connect),如果连接成功,这时客户端... 查看详情

一个简单的并发服务器(代码片段)

...继续用监听套接字的形式来等待下一个连接请求。代码段服务器程序1#!/usr/bin/ 查看详情

为从浏览器到 apache http 服务器到 Web 服务的 Web 套接字调用创建了多少 TCP 连接

】为从浏览器到apachehttp服务器到Web服务的Web套接字调用创建了多少TCP连接【英文标题】:HowmanytotalTCPconnectionsarecreatedforwebsocketcallfrombrowsertoapachehttpservertowebservice【发布时间】:2021-10-0813:33:28【问题描述】:我想知道当WebSocket调... 查看详情

理解爬虫原理(代码片段)

...作用原理包括四个步骤:    ①连接:Web浏览器与Web服务器建立连接,打开一个称为socket(套接字)的虚拟文件,此文件的建立标志着连接建立成功。    查看详情

socketserver服务(代码片段)

...实现多并发      2. SocketServer使编写一个Socket服务器通信变得更加简单      3. SocketServer其实就是对socket的再封装  2、SocketServer提供了4个基本的服务类      1.TCPServer针对TCP套接字流      2... 查看详情

使用单个套接字处理多个传入udp连接(代码片段)

...可以做到这一点吗?如果我使用多个线程,多个线程中的套接字是否有可能接受单个连接?这是我到目前为止所做的,谢谢!time_ttimeout=time(NULL);vector< 查看详情

c# - 处理关闭/断开 Web 套接字连接(CloseAsync 与 CloseOutputAsync)

】c#-处理关闭/断开Web套接字连接(CloseAsync与CloseOutputAsync)【英文标题】:c#-Handlingclosing/disconnectingwebsocketconnections(CloseAsyncvsCloseOutputAsync)【发布时间】:2015-07-0619:45:49【问题描述】:我正在尝试了解和处理关闭Web套接字连接的... 查看详情

如何使用套接字将arduino连接到c++?(代码片段)

我的C++客户端套接字代码只收集Arduino套接字服务器提供的输出的第一行(我想我可以称之为)。你能告诉我我的C++代码在哪里出错以及如何修复它吗?如果问题太冗长,请跳到底部的C++代码。硬件设置:带有以太网卡(屏蔽)... 查看详情

WebSocket 在几个时间间隔之间不断断开连接

...:2016-10-0513:05:24【问题描述】:我们正在使用Web套接字在服务器和Android应用程序之间进行实时通信。但是这里的主要问题是网络套接字在几个时间间隔内不断断开连接,我们无法在两侧设置套接字超时。关于这个主题被问了多... 查看详情

我一次可以打开多少个 TCP 套接字? [复制]

...布时间】:2014-03-2808:24:45【问题描述】:我要开发一个TCP服务器应用程序。我在“选择服务器”这一步。我的TCP服务器将有2000多个客户端,每个客户端都有一个套接字。根据操作系统,创建的套接字数量是否有限制?哪个操作... 查看详情

http协议(代码片段)

...响应的格式。HTTP工作原理HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本... 查看详情

一次可以打开的 Web 套接字客户端的数量

...问题描述】:我只是在看here找到的示例代码:当我运行服务器部分并启动客户端的多个实例时,我注意到当我同时启动大约40-50个实例时(使用Process.Start()),有时某些客户端无法连接。为什么会这样?实际上是什么阻止了所有... 查看详情

servlet和servlet容器(代码片段)

...let呢?是否可以不要。web开发的本质就一句话:客户端和服务器交换数据。于是你使用Java的Socket套接字进行编程,去处理客户端来的tcp请求,经过编解码处理读取请求体,获取请求行,然后找到请求行对应的处理逻辑步入服务... 查看详情

在 Windows 中 select() 可以处理的最大套接字数是多少?

】在Windows中select()可以处理的最大套接字数是多少?【英文标题】:Whatisthemaximumnumberofsocketsthatselect()canhandleinWindows?【发布时间】:2015-02-2009:17:41【问题描述】:select()默认可以处理64个套接字,我可以通过在编译时覆盖FD_SETSIZE... 查看详情