使用Linux BSD套接字,如果活动连接数是多少会发生什么超出系统限制?将接受呼叫返回错误?
即使系统可以接受无限期的插座连接,它可以超过整数最大值的大小吗?
套接字描述符是一个 4 字节整数值。公平地说,理论上不可能维持超过4294967295 32 位系统中具有单个进程的活动 TCP 连接?(假设硬件和操作系统可以支持这一点,服务质量无关紧要。我们只想保持活动的TCP连接)
这可能是一个愚蠢的问题,但我很好奇。
由于文件描述符是整数,因此您显然不能超过 4G 文件描述符。即使在 64 位系统上也是如此,因为 sizeof(int) 仍然是 4。理论上,您可以在多个进程中打开更多文件描述符。即使您增加所有/proc 限制,您也可能首先耗尽内核内存。
Linux 内核中每个插槽的分配在千字节范围内,因此即使在大型服务器(具有许多 GB RAM)上,最大连接数也以百万为单位,而不是数十亿。
从 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.
所以是的,在任何远程理智的配置中,接受将报告EMFILE或ENFILE。如果您将 fd 限制设置为某个天价值,您可能会获得 ENOBUFS/ENOMEM。您可能会在 int 数据类型的INT_MAX限制之前很久就达到这些限制。