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

Posted

技术标签:

【中文标题】我一次可以打开多少个 TCP 套接字? [复制]【英文标题】:How many TCP sockets can I open at once? [duplicate] 【发布时间】:2014-03-28 08:24:45 【问题描述】:

我要开发一个 TCP 服务器应用程序。我在“选择服务器”这一步。 我的 TCP 服务器将有 2000 多个客户端,每个客户端都有一个套接字。

根据操作系统,创建的套接字数量是否有限制?哪个操作系统允许在给定时间打开更多套接字?

【问题讨论】:

“选择服务器”是在“选择编程语言”之前还是之后? @corsiKa:可以同时打开的最大套接字数取决于操作系统,而不是编程语言。当然,除非您使用人为限制打开文件描述符数量的语言。 @GuntramBlohm 如果他选择自己处理驱动程序和连接.. 但那是疯狂和硬核.. 硬件也有限制:) @Guntram 向我帖子中在单个盒子上运行超过 100 万的人解释这一点。 耸耸肩 【参考方案1】:

是的,有一些限制,但你可能永远不会接近它们(连接与连接或传入连接不同,连接是已经发生并建立的事情,并且那个数字明显高于其他州。@corsiKa 对您可以拥有的连接会话数量给出了很好的报价。)

这里有一些有用的命令:

# Shows some general useful information,
ulimit -a

# if not, here are some other places to look
# maximum files:
cat /proc/sys/fs/file-max  

# maximum filedescriptors:
cat /proc/sys/fs/file-nr  

# maximum backlog of unaccepted clients:
cat /proc/sys/net/core/somaxconn

# And number of threads to run at once:
cat /proc/sys/kernel/threads-max

限制打开的You->Them 连接数量基本上是您有多少本地端口可用并分配为您的池,您可以在以下位置找到此信息:

sysctl net.ipv4.ip_local_port_range

传入端口上还有一个“缓冲区”,限制了您可以同时连接到您的客户端数量,请在此处找到此信息:

sysctl net.ipv4.tcp_max_syn_backlog
sysctl net.core.netdev_max_backlog

另外,在这里找到完整的描述:Increasing the maximum number of tcp/ip connections in linux

【讨论】:

如果所有客户端都连接到您,本地端口范围甚至无关紧要。想象一个 http 服务器,它可以从一个端口 80 提供 1000 个连接。 @GuntramBlohm 我知道夏洛克 :) 但是 OP 写了 is there limit for creating socket 在我的世界里,创建一个套接字与“我将连接到某个东西”和那是客户端。所以我只是提供了足够的信息来涵盖客户端和服务器端参数,因为它们有很大的不同:) 但是你在技术上是正确的.. 服务器可以在单个端口上托管 1000 个,如果不是更多的话.. 这就是 netdev_max_backlog 发挥作用 :) 'somaxconn' 不是'最大半开连接',它是最大积压,积压也不是'您可以同时连接到您的客户端数量',它是 TCP 已完成但尚未传递给接受的连接队列的长度。 -1 @EJP 您能否定义“连接到您”和“尚未接受”之间的区别,因为对我来说,它们是同一回事。此外,半开放连接与积压是一样的,它是一个等待发生但尚未接受并完全打开的连接。因此,半开。不知道你把这与什么混淆了?还是我是这样的? 这里唯一的困惑是你的。 (1) 您可以用 一个 客户端和足够的 sequential 连接填充积压队列。 Ergo 它与同时性或多个客户端无关。 (2) backlog queue上的一个连接是完整的,并且在所有意义上都是开放的:SYN、SYN/ACK和ACK都已经交换过了,客户端可以发送或接收,当然他会阻塞接收直到服务器发送一些东西,假设阻塞模式等。 (3) TCP 中的半开连接是一个 半关闭的连接, shutdown(fd,SHUT_WR). 你就是这样。【参考方案2】:

A 2Gb Windows server should support 16,000 - 这很不错,因为 2Gb 相当便宜:

在 Windows NT、Windows 2000、Windows XP 和 Windows 2003 Server 上,套接字是从非分页内存池中分配的,因此可以在系统范围内创建的实际套接字数取决于安装的物理内存量.非分页内存池是物理 RAM 大小的 1/8,在 Windows NT 上最大为 128Mb,在 Windows 2000 及更高版本平台上最大为 256Mb。 Windows NT 服务器的理论最大值约为 12,000 个套接字,Windows 2000 和更高版本为 25,000 个。 实际上,可以安全地估计,Windows Server 平台可以为每 512Mb 的物理内存分配大约 4,000 个套接字。对于 Windows NT,这意味着对于具有 1Gb 或更多 RAM 的系统,最大套接字数约为 8,000。对于 Windows 2000 及更高版本,具有 2Gb 或更多 RAM 的系统的最大套接字数约为 16,000。

它出现在 free BSD can have over 1 million,那是 2 年前的事了:

在过去的几个月里,我们一直在对我们的服务器进行大量改进,以提高性能、正常运行时间和可扩展性。今天我们调整了一些旋钮,转移了一些流量,并在一台机器上实现了 100 万个已建立的 tcp 会话(并且有内存和 cpu 空闲!)

$ netstat -an | grep -c EST

1016313

所以在 10^5 和 10^7 之间的某个地方,是的。

【讨论】:

这根本不准确,Torxed。以每秒 100 万个连接(平均持续时间为 10 秒)的速度有 1000 万个持续连接的例子。

以上是关于我一次可以打开多少个 TCP 套接字? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

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

一次可以处理多少个请求

我一次可以观察多少个 Stateflow?

一次从一个 TCP 套接字发送超过 32768 个字节到另一个

Google 会为它收到的每个请求打开多少个套接字?

多插座连接的优点