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

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

这看起来可能与编程有关,但这是一个操作系统问题。

我正在编写一个小型高性能守护程序,每秒处理数千个连接。它在 Linux 上运行良好(特别是 EC2 上的 Ubuntu 9.10)。在 Mac OS X 上,如果我在基准测试中向它发送几千个连接(大约 16350 个),该基准测试只是打开一个连接,执行其操作并关闭连接,那么基准测试程序会挂起几秒钟,等待套接字可用后再继续(或在此过程中超时)。

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

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

或者还有其他事情发生?

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

我尝试用 ulimit 进行各种调整,但毫无效果。

答案1

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  

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

可能有一个套接字选项或某些东西来告诉堆栈基本上违反 TCP 规范并对 TIME_WAIT 使用非标准值,但我并不是一名 Mac OS X 套接字程序员,因此不知道这一点。

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

相关内容