Mac OS X 是否会限制套接字创建的速率?

pbh*_*gan 7 networking throttling sockets macos

这似乎与编程有关,但这是一个操作系统问题。

我正在编写一个小型高性能守护进程,每秒需要数千个连接。它在 Linux 上运行良好(特别是 EC2 上的 Ubuntu 9.10)。在 Mac OS X 上,如果我在一个基准测试中抛出几千个连接(大约 16350 个),它只是打开一个连接,做它的事情并关闭连接,然后基准程序挂起几秒钟等待套接字变为可用在继续之前(或在过程中超时)。

我同时使用了 Apache Bench 和 Siege(以确保它不是基准应用程序)。

那么为什么/如何 Mac OS X 限制可以使用套接字的速率,我可以阻止它这样做吗?

还是有其他事情发生?

我知道有一个文件描述符限制,但我没有达到那个限制。接受套接字没有错误,它只是在第一个(大约)16000 之后挂起一段时间,等待 - 我假设 - 操作系统释放套接字。这不应该发生,因为此时所有先前的套接字都已关闭。它们应该以关闭的速度提供,并且可以在 Ubuntu 上使用,但是在 Mac OS X 上似乎存在某种多(5-10?)秒的延迟。

我尝试使用 ulimit 进行调整。纳达。

Spi*_*iff 16

Mac OS X 从 49152 开始打开临时端口。端口号是 16 位无符号整数,因此有 65535 个可能的端口。65535 - 49152 = 16383。我认为您在 TIME_WAIT 中有 16K 个端口。

更新:您可能需要查看以下 sysctl(8) 变量:

net.inet.ip.portrange.lowfirst: 1023  
net.inet.ip.portrange.lowlast: 600  
net.inet.ip.portrange.first: 49152  
net.inet.ip.portrange.last: 65535  
net.inet.ip.portrange.hifirst: 49152  
net.inet.ip.portrange.hilast: 65535  
Run Code Online (Sandbox Code Playgroud)

我认为如果您将 hifirst 设置为较低的值,您将增加系统上可用的临时端口数量。

可能有一个套接字选项或告诉堆栈基本上违反 TCP 规范并为 TIME_WAIT 使用非标准值的东西,但我对 Mac OS X 套接字程序员还不够了解。

更新 2:您可能想使用 setsockopt(2) 来设置 SO_REUSEADDR。