Mac OS X регулирует УРОВЕНЬ создания сокета?

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

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

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

Таким образом, почему/как Mac OS X ограничивает УРОВЕНЬ, на котором могут использоваться сокеты, и я могу мешать ему делать это?

Или есть ли что-то еще продолжение?

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

Я пытался настроить с ulimit во все стороны. Nada.

7
задан 10.06.2010, 17:58

1 ответ

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.

16
ответ дан 07.12.2019, 14:36

Теги

Похожие вопросы