Mac OS X是否会节制套接字创build的速率?

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

我正在编写一个小型的高性能守护进程,每秒需要上千个连接。 它在Linux上(尤其是EC2上的Ubuntu 9.10)运行良好。 在Mac OS X上,如果我在基准testing中发现了几千个连接(大约为16350),只需打开一个连接,是否closures连接,那么基准testing程序会挂起几秒钟,等待套接字变为可用之后继续(或在此过程中超时)。

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

那么为什么/如何Mac OS X限制插槽可以使用的速率,我可以阻止它做到这一点?

还是有其他事情呢?

我知道有一个文件描述符的限制,但我没有打这个。 接受一个套接字没有任何错误,它只是在第一个(大约)16000之后挂起一段时间,等待 – 我假设 – 操作系统释放一个套接字。 这不应该发生,因为之前所有的套接字都是在这个时候closures的。 他们应该按照他们closures的速度来使用,而在Ubuntu上使用,但是在Mac OS X上似乎有一些多(5-10?)秒的延迟。

我试图用ulimit每一个方式调整。 纳达。

所以原来Mac OS X的临时端口范围是相当低的。

维基百科告诉我,IANAbuild议49152至65535为“dynamic和/或专用端口”,而许多Linux内核使用32768至61000. OS X使用IANA范围。 这意味着Linux几乎是可用临时端口的两倍。 由于每个closures的套接字都经历了一个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)

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

这个网站和其他一些人提示BSD Unix系统的套接字与文件描述符绑定,所以文件的限制可能与你的开放套接字限制有关。