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

Posted

技术标签:

【中文标题】可能有多少个套接字连接?【英文标题】:How many socket connections possible? 【发布时间】:2010-10-13 16:38:19 【问题描述】:

有谁知道现代标准 Linux 服务器上可能有多少个 tcp-socket 连接?

(通常每个连接上的流量较少,但所有连接都必须一直处于运行状态。)

【问题讨论】:

对于Windows,看这个问题[Windows并发tcp/ip连接的最大数量是多少?][1] [1]:***.com/questions/413110/… 【参考方案1】:

我在 Linux 桌面(16G RAM,I7 2600 CPU)上实现了 1600k 并发空闲套接字连接,同时实现了 57k req/s。它是用 C 语言编写的带有 epoll 的单线程 http 服务器。源代码在github,blog here。

编辑:

我在同一台计算机上使用 JAVA/Clojure 进行了 600k 并发 HTTP 连接(客户端和服务器)。详细信息post,HN讨论:http://news.ycombinator.com/item?id=5127251

一个连接的成本(使用epoll):

应用程序每个连接都需要一些 RAM TCP 缓冲区 2 * 4k ~ 10k,或更多 epoll 需要一些内存用于文件描述符,来自 epoll(7)

每个注册的文件描述符大约需要 90 32 位内核上的字节,而 64 位内核上大约 160 字节。

【讨论】:

哈哈哈...1000万连接highscalability.com/blog/2013/5/13/… @Bangash 我的评论与 Erlang 完全无关,或者实际上除了 leef 发表评论说单个盒子上有 100 万个套接字连接,但这个答案谈到了 160 万个- 因此,这似乎是一个愚蠢的评论。 Erlang 很棒 - 支持 CouchDB。但是,我看不出你的评论在这里有什么意义。【参考方案2】:

这不仅取决于相关操作系统,还取决于配置,可能是实时配置。

对于 Linux:

cat /proc/sys/fs/file-max

将显示当前允许同时打开的最大文件描述符总数。查看http://www.cs.uwaterloo.ca/~brecht/servers/openfiles.html

【讨论】:

刚刚检查了我的 ubuntu (13.04) 笔记本电脑... 386491。我怀疑这将是我遇到的第一个限制。 在我的 Debian 不稳定(内核 4.19.0-1-amd64)上:18446744073709551615。;)【参考方案3】:

10,000? 70,000?就是这样:)

FreeBSD 可能是您想要的服务器,这里有一个 little blog post ,关于调整它以处理 100,000 个连接,它有一些有趣的特性,比如零拷贝套接字已经有一段时间了,以及作为完成端口机制的 kqueue .

Solaris can handle 100,000 connections回到上个世纪!他们说linux会更好

我遇到的最好的描述是这篇关于编写可扩展网络服务器的演示文稿/论文。他不怕这样说:)

软件也是如此: 应用层强制很棒 操作系统层的创新。因为 Lotus Notes 保持一个 TCP 连接 每个客户开放,IBM 贡献了主要 优化“一个过程, Linux 的 100.000 个打开连接”案例

而 O(1) 调度程序最初是 创建在某些方面得分很高 无关的 Java 基准测试。底端 线是这种膨胀有利于所有 我们。

【讨论】:

我停在了 70,000,因为这超出了我的客户要求;所以测试通过了。随着计算非分页池限制的方式发生变化,我可以想象一台 Windows Server 2008 机器在 100,000 个连接时不会有问题。 你能分享你引用的演示文稿的链接吗? @BrianCline 你可能不再需要它了,但我也想要它,我想我找到了它:slideshare.net/Arbow/scalable-networking(幻灯片 33)【参考方案4】:

在 /proc 文件系统中可以配置打开的套接字数量的限制

cat /proc/sys/fs/file-max

操作系统中传入连接的最大值由整数限制定义。

Linux 本身允许 数十亿 个打开的套接字。

要使用套接字,您需要一个应用程序监听,例如一个 Web 服务器,每个套接字将使用一定数量的 RAM。

RAM 和 CPU 将引入真正的限制。 (现代 2017 年,认为数百万而不是数十亿)

100 万是可能的,并不容易。预计将使用 X GB 的 RAM 来管理 100 万个套接字。

传出 TCP 连接受限于每个 IP 约 65000 个端口号。您可以拥有多个 IP 地址,但不能拥有无限的 IP 地址。 这是 TCP 而非 Linux 中的限制。

【讨论】:

【参考方案5】:

在 Linux 上,您应该考虑使用 epoll 进行异步 I/O。可能还值得微调套接字缓冲区,以免每个连接浪费太多内核空间。

我猜你应该能够在一台合理的机器上达到 10 万个连接。

【讨论】:

【参考方案6】:

取决于应用程序。如果每个客户端只有几个包,那么 100K 对于 linux 来说非常容易。我团队的一位工程师多年前做过一个测试,结果显示:当连接建立后没有来自客户端的包时,linux epoll 可以在 cpu 使用率低于 50% 的情况下观察 400k fd 的可读性。

【讨论】:

【参考方案7】:

哪个操作系统?

对于 Windows 机器,如果您编写的服务器可以很好地扩展,因此使用 I/O 完成端口和异步 I/O,那么主要限制是您使用的非分页池的数量每个活动连接。这直接转化为基于您的计算机已安装的内存量的限制(非分页池是基于安装的总内存的有限、固定大小的量)。

对于流量不大的连接,您可以通过发布不使用非分页池且不影响锁定页面限制的“零字节读取”(另一种可能有限的资源可能会阻止您打开大量套接字连接)。

除此之外,您还需要进行分析,但我已经设法在一个适度指定的(760MB 内存)服务器上获得了超过 70,000 个并发连接;请参阅此处http://www.lenholgate.com/blog/2005/11/windows-tcpip-server-performance.html 了解更多详情。

显然,如果您使用的是效率较低的架构,例如“每个连接线程”或“选择”,那么您应该期望获得不那么令人印象深刻的数字;但是,恕我直言,没有理由为 Windows 套接字服务器选择这样的架构。

编辑:见这里http://blogs.technet.com/markrussinovich/archive/2009/03/26/3211216.aspx;在 Vista 和 Server 2008 中计算非分页池数量的方式发生了变化,现在可用的数量更多。

【讨论】:

嗯。有趣的。在 W2K 上使用 128mb 的非分页池,使用 IOCP,我可以维持 4,000 个 active 套接字(例如并发流)。当这些套接字空闲时,我可以维持大约 16,000 个。我猜你的套接字是空闲的和/或这个零字节读取票有帮助。 定义活动。您正在另一台机器上运行测试客户端?您正在使用某种形式的流量控制来管理您发送的数据量?我的套接字正在回显消息,但没有使用零字节读取。他们没有用尽全力并尽可能快地传输数据。 我以为你只能在 Windows 上获得 65k 连接 - 你必须编辑 tcpnumconnections 注册表设置。 (在 XP 上,他们在 tcpip.sys 中进一步限制了它,在 bittorrent 网站上有很多关于这个的讨论) 我想你会感到困惑。 tcpip.sys 中的限制是针对半开连接的,它限制了您在任何时候可以进行的并发连接数。 MaxUserPort 注册表项限制了客户端端口的数量,因此您可以在此处设置的最大值将限制您可以建立的 OUTBOUND 连接的数量。可能的 INBOUND 连接数没有限制。【参考方案8】:

实际上,对于一个应用程序,单台机器上超过 4000-5000 个打开的套接字变得不切实际。仅仅检查所有套接字上的活动并对其进行管理开始成为一个性能问题——尤其是在实时环境中。

【讨论】:

声明过于宽泛。实际上,这完全取决于您在应用程序层所做的事情;在几乎所有情况下,这都会成为您的性能瓶颈。 实际上有很多工作服务器远远超过这个并发连接数。

以上是关于可能有多少个套接字连接?的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

2020-06-18 面试:netty最多可以支持多少个websocket 长连接

多插座连接的优点

Blazor WASM 异常导致数百个额外的套接字和连接异常