使用linux BSD socket,如果活动连接数超出系统限制会怎样?会接受呼叫返回错误吗?
即使系统可以接受无限的套接字连接,它是否可以超过整数最大值的大小?
套接字描述符是一个 4 字节的整数值。公平地说,在 32 位系统中与单个进程保持超过 4294967295 个活动 TCP 连接在理论上是不可能的吗?(假设硬件和操作系统可以支持这一点。服务质量并不重要。我们只是想保持活动的 TCP 连接)
这可能是一个愚蠢的问题,但我很好奇。
从 Linux 系统上的 accept(2) 联机帮助页:
EMFILE The per-process limit of open file descriptors has been reached.
ENFILE The system limit on the total number of open files has been reached.
ENOBUFS, ENOMEM
Not enough free memory. This often means that the memory allocation is limited by the socket buffer limits, not by the
system memory.
所以是的,在任何远程理智的配置中,accept 都会报告 EMFILE 或 ENFILE。如果您将 fd 限制设置为某个极高的值,您可能会改为获得 ENOBUFS/ENOMEM。您可能会在 int 数据类型的 INT_MAX 限制之前很久就达到这些限制。
由于文件描述符是整数,那么您显然不能超过 4G 文件描述符。即使在 64 位系统上也是如此,因为 sizeof(int) 仍然是 4。理论上,您可以跨多个进程打开更多文件描述符。即使您增加所有 /proc 限制,您也可能首先用完内核内存。
linux 内核中的每个套接字分配在千字节范围内,因此即使在大型服务器(具有许多 GB 内存)上,最大连接数也以数百万而不是数十亿来衡量。