Это может казаться связанным программированием, но это - вопрос об ОС.
Я пишу маленькому высокопроизводительному демону, который берет тысячи соединений в секунду. Это хорошо работает на Linux (конкретно Ubuntu 9.10 на EC2). На Mac OS X, если я бросаю несколько тысяч соединений в него (примерно приблизительно 16 350) в сравнительном тесте, который просто открывает соединение, делает это - вещь и закрывает соединение, затем эталонная тестовая программа зависает в течение нескольких секунд, ожидая сокета для становления доступной прежде, чем продолжиться (или испытать таймаут в процессе).
Я использовал оба Места размещения Apache, а также Осаду (чтобы удостовериться, что это не было приложение сравнительного теста).
Таким образом, почему/как Mac OS X ограничивает УРОВЕНЬ, на котором могут использоваться сокеты, и я могу мешать ему делать это?
Или есть ли что-то еще продолжение?
Я знаю, что существует предел дескриптора файла, но я не поражаю это. Нет никакой ошибки при принятии сокета, это, просто зависает некоторое время после первого (примерно) 16 000 ожидая - я принимаю - для ОС для выпуска сокета. Этого не должно происходить начиная со всех предшествующих сокеты закрываются в той точке. Они, как предполагается, прибывают доступные в уровень, они закрываются и делают на Ubuntu, но, кажется, существует некоторое много (5-10?) вторая задержка на Mac OS X.
Я пытался настроить с ulimit во все стороны. Nada.
Mac OS X начинает открывать эфемерные порты в 49 152. Номера портов являются 16-разрядными целыми числами без знака, таким образом, существует 65 535 возможных портов. 65535 - 49152 = 16383. Я думаю, что у Вас есть 16K порты в TIME_WAIT.
Обновление: Вы могли бы хотеть посмотреть на следующий sysctl (8) переменные:
net.inet.ip.portrange.lowfirst: 1023
net.inet.ip.portrange.lowlast: 600
net.inet.ip.portrange.first: 49152
net.inet.ip.portrange.last: 65535
net.inet.ip.portrange.hifirst: 49152
net.inet.ip.portrange.hilast: 65535
Я думаю, устанавливаете ли Вы hifirst на что-то ниже, Вы увеличите число эфемерных портов, доступных в Вашей системе.
Могла бы быть опция сокета или что-то, чтобы сказать стеку в основном нарушать спецификацию TCP и использовать нестандартное значение для TIME_WAIT, но я - недостаточно программиста сокетов Mac OS X для знания этого.
Обновление 2: Вы, вероятно, хотите использовать setsockopt (2) для установки SO_REUSEADDR.