这可能看起来与编程有关,但这是一个操作系统的问题。
我正在编写一个小型的高性能守护进程,每秒需要上千个连接。 它在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系统的套接字与文件描述符绑定,所以文件的限制可能与你的开放套接字限制有关。