我将要开发一个TCP服务器应用程序。我现在处于“选择服务器”步骤。
我的TCP服务器将有2000多个客户端,每个客户端都有一个套接字。
根据操作系统,创建的套接字数量是否有限制?哪个操作系统允许在给定时间内打开更多的套接字?
我将要开发一个TCP服务器应用程序。我现在处于“选择服务器”步骤。
我的TCP服务器将有2000多个客户端,每个客户端都有一个套接字。
根据操作系统,创建的套接字数量是否有限制?哪个操作系统允许在给定时间内打开更多的套接字?
是的,确实存在一些限制,但你很可能永远不会接近它们(连接并不等同于连接或传入连接,连接是已经发生并建立的一些东西,而这个数字显著高于其他状态。@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连接的最大数量
是否有创建套接字的限制
,在我的世界中,创建套接字与“我将连接到某个东西”是相同的,这是客户端。因此,我提供了足够的信息来涵盖客户端和服务器端参数,因为它们有很大的不同 :) 但是,是的,你在技术上是正确的...一个服务器可以在单个端口上托管数千个甚至更多.. 这就是netdev_max_backlog发挥作用的地方 :) - Torxedshutdown(fd, SHUT_WR)
的连接。你的理解完全错了。 - user207421一个 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个套接字之间。