Назад | Перейти на главную страницу

Ограничивает ли Mac OS X СКОРОСТЬ создания сокетов?

Это может показаться связанным с программированием, но это вопрос ОС.

Я пишу небольшой высокопроизводительный демон, который использует тысячи соединений в секунду. Он отлично работает в 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 сокеты привязаны к файловым дескрипторам, поэтому, возможно, ограничение файла может быть связано с вашими ограничениями открытых сокетов.