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

3342
pbhogan

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

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

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

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

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

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

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

7
Не пересекайте почту - http://serverfault.com/questions/145907/does-mac-os-x-throttle-the-rate-of-socket-creation MDMarra 13 лет назад 0
это хороший вопрос, и это одна из тех серых областей, которые могут быть одинаково приемлемы для Super User * или * Server Fault. тем не менее, вы не должны сначала кросспост и задавать вопросы позже. размещать на одном сайте или другом. затем, если по истечении разумного времени он не получит хороших ответов, вы можете пометить внимание модератора, чтобы запросить его перенос на другой сайт. quack quixote 13 лет назад 0
@MarkM Почему бы и нет? Это применимо к обоим и, хотя немного более относится к ServerFault, я получил ответ здесь и отправил ответ другому. Это даже относится к StackOverflow, хотя я решил не публиковать там, так как был уверен, что проблема не в коде. Перекрестная публикация неплоха, если она актуальна для каждого сообщества, так как она обеспечивает ценность для обоих. Вы не всегда знаете, под каким углом ответ придет. pbhogan 13 лет назад 1
@ Quack Quixote Я не знал, что есть протокол для этого. Я не совсем согласен с этим, но постараюсь следовать этому в будущем. pbhogan 13 лет назад 0
* как правило * кросспосты плохие (потому что спрашивающий не знает, к какому сайту относится вопрос; обычно результатом является миграция и дублирование вопросов). это не тот случай - как я уже сказал, я думаю, что это одинаково приемлемо на любом сайте. тем не менее, я думаю, что перекрестные посты следует избегать. «пост-на-одном-потом-мигрировать-если-нужно» мне кажется разумным протоколом. Спасибо! quack quixote 13 лет назад 1

1 ответ на вопрос

16
Spiff

Mac OS X начинает открывать временные порты с 49152. Номера портов представляют собой 16-разрядные целые числа без знака, поэтому существует 65535 возможных портов. 65535 - 49152 = 16383. Я думаю, что у вас есть 16 тыс. Портов в 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.

Ты прав. Netstat говорит мне, что они все в TIME_WAIT. Я уже использую SO_REUSEADDR на демоне, но приложения-тесты, вероятно, этого не делают, поэтому он перевернулся. Конечно, маловероятно, что один клиент в любом случае откроет столько одновременных подключений (в отличие от повторного использования одного или нескольких подключений). pbhogan 13 лет назад 0
sudo sysctl -w net.inet.ip.portrange.first = 32768 помогло устранить проблему. В Mac OS X, вероятно, нужно установить как hifirst, так и first, потому что с ними обращаются одинаково, и вы не знаете, какой из них используется. Смотрите также: http://www.ncftp.com/ncftpd/doc/misc/ephemeral_ports.html#FreeBSD pbhogan 13 лет назад 0
Этот ответ полностью решил ту же проблему, что и у меня, с Java / JMeter, 1000 запросов в секунду к быстрому веб-сервису (локальное тестирование производительности). StaxMan 10 лет назад 0