Это может показаться связанным с программированием, но это вопрос ОС.
Я пишу небольшой высокопроизводительный демон, который использует тысячи соединений в секунду. Он отлично работает в Linux (в частности, Ubuntu 9.10 на EC2). В Mac OS X, если я наведу на него несколько тысяч подключений (примерно 16350) в тесте, который просто открывает соединение, делает это и закрывает соединение, тогда программа тестирования зависает на несколько секунд, ожидая, пока сокет станет доступным. перед продолжением (или тайм-аут в процессе).
Я использовал как Apache Bench, так и Siege (чтобы убедиться, что это не тестовое приложение).
Так почему / как Mac OS X ограничивает СКОРОСТЬ, с которой могут использоваться сокеты, и могу ли я остановить это от этого?
Или что-то еще происходит?
Я знаю, что существует ограничение на количество дескрипторов файла, но я его не использую. Ошибки при приеме сокета нет, он просто зависает на некоторое время после первых (примерно) 16000, ожидая - я полагаю, - чтобы ОС освободила сокет. Этого не должно происходить, поскольку в этот момент все сокеты закрываются. Предполагается, что они будут доступны по мере их закрытия, как и в Ubuntu, но, похоже, есть какая-то задержка в несколько секунд (5-10?) В Mac OS X.
Я пробовал настраивать ulimit везде. Нада.
Оказывается, диапазон временных портов 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
Это даст примерно удвоенный диапазон.
(Спасибо Спиффу, который ответил здесь более подробно: 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 сокеты привязаны к файловым дескрипторам, поэтому, возможно, ограничение файла может быть связано с вашими ограничениями открытых сокетов.