我能同时打开多少个TCP套接字?

9

我将要开发一个TCP服务器应用程序。我现在处于“选择服务器”步骤。

我的TCP服务器将有2000多个客户端,每个客户端都有一个套接字。

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


“选择服务器”在“选择编程语言”之前还是之后? - corsiKa
5
同时打开的套接字数量的最大值取决于操作系统而不是编程语言。当然,除非你使用人为限制已打开文件描述符数量的编程语言。 - Guntram Blohm
@GuntramBlohm 如果他选择自己处理驱动程序和连接,那就疯狂又高级了。此外,硬件也有限制 :) - Torxed
@Guntram向我帖子中那些在单个盒子上运行超过100万的人解释一下吧。耸肩 - corsiKa
2个回答

8

是的,确实存在一些限制,但你很可能永远不会接近它们(连接并不等同于连接或传入连接,连接是已经发生并建立的一些东西,而这个数字显著高于其他状态。@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

此外,你可以在这里找到完整的描述:在Linux中增加TCP/IP连接的最大数量


1
如果所有客户端都连接到您,本地端口范围甚至并不重要。想象一个HTTP服务器,可以从一个单独的80端口提供数千个连接。 - Guntram Blohm
@GuntramBlohm 我知道Sherlock :) 但是OP写道是否有创建套接字的限制,在我的世界中,创建套接字与“我将连接到某个东西”是相同的,这是客户端。因此,我提供了足够的信息来涵盖客户端和服务器端参数,因为它们有很大的不同 :) 但是,是的,你在技术上是正确的...一个服务器可以在单个端口上托管数千个甚至更多.. 这就是netdev_max_backlog发挥作用的地方 :) - Torxed
'somaxconn' 不是 '最大半开连接数',它是最大的等待队列长度,而等待队列长度也不是 '您可以同时连接的客户端数量',它是已由TCP完成但尚未传递给accept的连接队列的长度。-1 - user207421
@EJP 您能否请您解释一下“连接到您”和“尚未接受”之间的区别,因为在我看来这些都是一样的。而半开放连接与后备队列是同一回事,它是一种等待发生但尚未被完全打开的连接。因此,是半开放的。不确定您混淆了什么?还是我理解得有误? - Torxed
这里唯一的困惑是你自己的问题。(1) 你可以用一个客户端和足够的连续连接填充待处理队列。因此,它与同时性或多个客户端无关。(2) 处于待处理队列中的连接在所有方面都是完整且打开的:SYN、SYN/ACK 和 ACK 都已交换,并且客户端可以发送或接收数据,尽管他会被阻塞在接收方面,直到服务器发送一些数据为止,假设阻塞模式等等。(3) 在 TCP 中,半开连接指的是已经半闭合并使用了shutdown(fd, SHUT_WR) 的连接。你的理解完全错了。 - user207421

7

一个 2Gb Windows服务器应该支持16,000个 - 这相当不错,因为2Gb相对来说很便宜:

在Windows NT、Windows 2000、Windows XP和Windows 2003 Server上,套接字是从非分页内存池中分配的,因此系统范围内实际可以创建的套接字数量取决于安装的物理内存量。非分页内存池的大小是物理RAM的1/8,最大值为128Mb(Windows NT)和256Mb(Windows 2000及更高版本)。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。

看起来FreeBSD可以拥有超过100万个,而那是在2年前:

在过去的几个月中,我们一直在改进我们的服务器以提高性能、可用性和可扩展性。今天,我们调整了一些参数,调整了一些流量,并在单台机器上实现了100万个已建立的TCP会话(并且还有足够的内存和CPU!)

$ netstat -an | grep -c EST

1016313

因此,在10^5到10^7个套接字之间。


2
那不准确,Torxed。在野外有一些例子,每秒100万个连接的持续连接达到1000万个(平均持续时间为10秒)。 - corsiKa

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接