这看起来可能与编程有关,但这是一个操作系统问题。
我正在编写一个小型高性能守护程序,每秒处理数千个连接。它在 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 临时端口范围相当低。
维基百科告诉我,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
这将使范围增加一倍左右。
(感谢 Spiff 在这里做出更详细的回答:https://superuser.com/questions/145989/does-mac-os-x-throttle-the-rate-of-socket-creation)
答案2
这可能是缓冲区限制吗?http://www.psc.edu/networking/projects/tcptune/#MacOS
本网站其他一些人暗示,BSD Unix 系统的套接字与文件描述符绑定,因此文件限制可能与打开的套接字限制绑定。