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