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

2024-04-24

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

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


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

今天,我担心带有 ASP.NET 的 IIS 是否支持 100 个并发连接(查看我的更新,预计在较旧的 ASP.Net Mono 版本上每秒大约有 10k 响应)。当我看到这个问题/答案时,我忍不住回答自己,这里问题的许多答案都是完全错误的。

最佳案例

这个问题的答案必须只涉及最简单的服务器配置,以与下游可能的无数变量和配置解耦。

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

  1. TCP 会话上没有流量,除了保持活动的数据包(否则您显然需要相应数量的网络带宽和其他计算机资源)
  2. 软件设计为使用异步套接字和编程,而不是池中每个请求的硬件线程。 (即 IIS、Node.js、Nginx...带有异步设计的应用程序软件的网络服务器 [但不是 Apache])
  3. 良好的性能/美元CPU/内存。今天,随意假设 i7(4 核)和 8GB RAM。
  4. 一个好的防火墙/路由器相匹配。
  5. 没有虚拟限制/调节器 - 即。 Linux somaxconn、IIS web.config...
  6. 不依赖其他较慢的硬件 - 不从硬盘读取,因为它将是最低的共同点和瓶颈,而不是网络 IO。

详细解答

相对于异步 IO 实现,同步线程绑定设计往往性能最差。

WhatsApp 可以在一台 Unix 风格的操作系统机器上处理百万流量 -https://blog.whatsapp.com/index.php/2012/01/1-million-is-so-2011/ https://web.archive.org/web/20120108184257/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 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 一样提供了完整的异步支持。无论什么操作系统和平台,异步都应该表现得很好。无论您选择哪种语言,请查找关键字“异步”,大多数现代语言都会提供一些支持,即使它是某种附加组件。

去网络农场?

无论您的特定情况有什么限制,网络农场都是一种很好的扩展解决方案。有许多架构可以实现这一点。一种是使用负载平衡器(托管提供商可以提供这些,但即使这些也有限制,以及带宽上限),但我不喜欢这个选项。对于具有长时间运行连接的单页应用程序,我更喜欢拥有一个开放的服务器列表,客户端应用程序将在启动时随机选择这些服务器,并在应用程序的生命周期内重复使用。这消除了单点故障(负载均衡器),并支持通过多个数据中心进行扩展,从而获得更多带宽。

打破神话 - 64K 端口

对于有关“64,000”的问题部分,这是一个误解。一台服务器可以连接超过 65535 个客户端。看https://networkengineering.stackexchange.com/questions/48283/is-a-tcp-server-limited-to-65535-clients/48284 https://networkengineering.stackexchange.com/questions/48283/is-a-tcp-server-limited-to-65535-clients/48284

顺便说一句,Windows 上的 Http.sys 允许多个应用程序在 HTTP URL 架构下共享同一服务器端口。它们各自注册一个单独的域绑定,但最终有一个服务器应用程序将请求代理到正确的应用程序。

更新2019-05-30

以下是最快的 HTTP 库的最新比较 -

  • 测试日期:2018-06-06
  • 使用的硬件:Dell R440 Xeon Gold + 10 GbE
  • 领导者每秒有大约 700 万个纯文本响应(响应而不是连接)
  • 第二个 Fasthttp for golang 通告 1.5M 并发连接 - 请参阅https://github.com/valyala/fasthttp https://github.com/valyala/fasthttp
  • 领先的语言是 Rust、Go、C++、Java、C,甚至 C# 排名第 11 位(每秒 6.9M)。 Scala 和 Clojure 排名更靠后。 Python 以每秒 270 万的速度排名第 29 位。
  • 在列表的底部,我注意到 laravel 和 cakephp、rails、aspnet-mono-ngx、symfony、zend。均低于每秒 10k。请注意,大多数这些框架都是为动态页面构建的,并且相当古老,可能有较新的变体在列表中排名靠前。
  • 请记住,这是 HTTP 明文,不适用于 Websocket 专业:许多人来到这里可能会对 Websocket 的并发连接感兴趣。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Web 服务器可以处理多少个套接字连接? 的相关文章

  • C# HTTP 请求解析器[重复]

    这个问题在这里已经有答案了 可能的重复 将原始 HTTP 请求转换为 HTTPWebRequest 对象 https stackoverflow com questions 318506 converting raw http reques
  • 以 REST 方式更新整个资源集合

    我有一个资源列表的 REST URI 例如 http foo com group users 这些用户中的每一个都有一个序列号 我想公开一种方法来为集合中的所有用户重新编号这些值 并使访问该列表的每个人都可以使用此更改 由于这是对整个集合的
  • 使用 Java 通过 HTTP 下载未知长度的文件

    我想用java下载一个HTTP查询 但是我下载的文件在下载时有一个未确定的长度 我认为这将是相当标准的 所以我搜索并找到了它的代码片段 http snipplr com view 33805 http snipplr com view 33
  • 为什么SOCKS5需要通过UDP中继UDP?

    The SOCKS5 https en wikipedia org wiki SOCKS SOCKS5协议 描述为RFC1928 https www rfc editor org rfc rfc1928提供对 UDP 的支持 总而言之 希望
  • 是什么导致“线程被中止”异常随机发生并向浏览器显示 HTTP 标头和部分 HTML?

    发生的情况偶尔是随机的 而不是像您期望的那样将 HTML 返回到浏览器 它看起来有点像这样 线程正在中止 HTTP 1 1 200 OK 标题的其余部分 如 HTML 的 1 10 就是这样 他们实际上在浏览器窗口中收到了一堆文本 它不会一
  • 防止表单重新提交

    第一页包含一个 HTML 表单 第二页 处理提交的数据的代码 第一页中的表格已提交 浏览器被重定向到第二页 第二页处理提交的数据 此时 如果刷新第二页 则会弹出 确认表单重新提交 警报 这可以预防吗 人们过去常采取两种方法 方法一 使用 A
  • 机器的最大 TCP 连接数

    我正在 NET 中创建一个 Windows 服务 N 个客户端可以连接到该服务 该服务启动 TCP 侦听器并接受客户端连接 我面临的问题是我只能打开 10 个到该服务的连接 Listener AcceptTcpClient 方法仅接受 10
  • 如何获取 3G 调制解调器的 IP 地址?

    我的 GPRS 调制解调器有一张 SIM 卡 它可以连接Web Web 服务给它一个 IP 号码 我需要它 像那样 http www your ip address com http www your ip address com 我怎样才
  • eBay API 调用不适用于 UPC/EAN

    eBay 的 API findItemsByProduct 操作适用于 UPC 和 EAN 但不幸的是它不起作用 例如 下面的 HTTP GET 请求会抛出 无效的产品 ID 值 错误41 Note 请将 SECURITY APPNAME
  • 如何知道哪个本地应用程序连接到我的套接字(Windows)

    我有一个绑定到某个 TCP 端口的 Windows 服务 该端口用于我的应用程序之间的 IPC 有没有一种编程 WinAPI WinSocket 等 方法可以知道哪个应用程序连接到我的端口 即在我的 Windows 服务中 我想获取连接到我
  • Crystal lang如何从http获取二进制文件

    In Ruby require open uri download open http example com download pdf IO copy stream download my file pdf 如何在水晶中做同样的事情 我们
  • Response.Redirect 并不总是重定向

    我们在一个工作不一致的页面上有一个简单的 Response Redirect IIS 6 0 大多数情况下 它会正确重定向 但我们收到一些用户抱怨 他们没有重定向 而是看到 302 对象移至此处 页面 该页面显示标题信息以及正确的位置 如果
  • 如何解决 302 重定向上的 POST 更改为 GET 的问题?

    我网站的某些部分只能通过 HTTPS 访问 不是整个网站 安全与性能妥协 并且如果通过纯 HTTP 发送请求 则 HTTPS 是通过对安全部分的请求进行 302 重定向来强制执行的 问题是对于所有主流浏览器来说 如果您在 POST 上执行
  • 对于较大的请求正文,Nginx proxy_cache_key $request_body 将被忽略

    我使用 nginx 作为反向代理 我希望它能够缓存 POST 请求 我的后端已正确配置为为 POST 请求返回适当的缓存控制标头 在 nginx 中我配置了 proxy cache methods POST proxy cache key
  • 如何让 HttpClient 返回状态码和响应正文?

    我试图让 Apache HttpClient 触发 HTTP 请求 然后显示 HTTP 响应代码 200 404 500 等 以及 HTTP 响应正文 文本字符串 重要的是要注意我正在使用v4 2 2因为大多数 HttpClient 示例都
  • 使用 IdTCPClient 和 IdTCPServer 发送和接收 TMemoryStream

    我在 XE2 中找到了 Remy Lebeau 的 IdTCP 组件聊天演示 我想玩一下 可以发现 我想使用这些组件发送图片 最好的方法似乎是使用 TMemoryStream 如果我发送字符串 连接工作正常 字符串传输成功 但是当我将其更改
  • Node.js 上的 Connect 出现“无法 GET /”

    我正在尝试使用以下方式开始提供一些静态网页connect像这样 var connect require connect var nowjs require now var io require socket io var app conne
  • 立即检测客户端与服务器套接字的断开连接

    如何检测客户端已与服务器断开连接 我的代码中有以下代码AcceptCallBack method static Socket handler null public static void AcceptCallback IAsyncResu
  • 如何向 node-http-proxy 响应添加标头

    我需要在第三方服务上解决CORS 所以我想构建一个代理来添加标头 Access Control Allow Origin 为什么这段代码没有添加标题 httpProxy require http proxy var URL https th
  • 如何使用 python urllib 在 HTTP/1.1 中保持活力

    现在我正在这样做 Python3 urllib url someurl headers HOST somehost Connection keep alive Accept Encoding gzip deflate opener urll

随机推荐