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

pbh*_*gan 8 networking mac-osx socket throttling

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

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

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

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

还是有其他事情发生?

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

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

pbh*_*gan 11

所以事实证明 Mac OS X 的临时端口范围相当低。

维基百科告诉我,IANA 建议将 49152 到 65535 作为“动态和/或专用端口”,而许多 Linux 内核使用 32768 到 61000。OS X 使用 IANA 范围。这意味着 Linux 的可用临时端口几乎是其两倍。由于每个关闭的套接字都经历了 TIME_WAIT 状态(我不知道),因此速率只会使我的系统不堪重负。

怎么修?

sudo sysctl -w net.inet.ip.portrange.first=32768
sudo sysctl -w net.inet.ip.portrange.hifirst=32768
Run Code Online (Sandbox Code Playgroud)

这将使范围增加一倍。

(感谢 Spiff 在此处更详细地回答:https ://superuser.com/questions/145989/does-mac-os-x-throttle-the-rate-of-socket-creation )


Bar*_*rim 0

这可能是缓冲区限制吗?http://www.psc.edu/networking/projects/tcptune/#MacOS

该站点和其他一些站点暗示 BSD Unix 系统具有与文件描述符相关联的套接字,因此文件限制可能与您的打开套接字限制相关联。