Mac OS X регулирует скорость создания сокетов?

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

Я пишу небольшой высокопроизводительный демон, который принимает тысячи соединений в секунду. Он отлично работает на Linux (в частности, Ubuntu 9.10 на EC2). В Mac OS X, если я добавлю несколько тысяч соединений (примерно 16350) в тест, который просто открывает соединение, делает свое дело и закрывает соединение, тогда программа тестов зависает на несколько секунд, ожидая, пока сокет станет доступным перед продолжением (или тайм-аут в процессе).

Я использовал как Apache Bench, так и Siege (чтобы убедиться, что это не тестовое приложение).

Так почему / как Mac OS X ограничивает RATE, при котором можно использовать сокеты, и могу ли я помешать ему это сделать?

Или что-то еще происходит?

Я знаю, что есть предел файлового дескриптора, но я не достигаю этого. Нет ошибки при приеме сокета, он просто на некоторое время зависает после первых (примерно) 16000, ожидая - я полагаю - ОС освободит сокет. Этого не должно происходить, так как все до этого сокеты закрыты в этой точке. Предполагается, что они будут доступны с той скоростью, с которой они закрыты, и работают в Ubuntu, но, похоже, в Mac OS X есть задержка в несколько (5-10?) Секунд.

Я пытался настроить с ulimit в любом направлении. Нада.

2 ответа

Таким образом, оказывается, что диапазон временных портов Mac OS X довольно низок.

Википедия сообщает мне, что IANA предлагает 49152–55535 в качестве "динамических и / или частных портов", в то время как многие ядра 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/

Этот сайт и некоторые другие намекают на то, что в системах BSD Unix сокеты связаны с файловыми дескрипторами, поэтому ограничение файла может быть связано с вашими ограничениями открытых сокетов.

Другие вопросы по тегам