Максимальное количество активных сокетов vxworks 6.3 составляет 255?

У меня есть сервер LPD, работающий на vxworks 6.3. Клиентское приложение (которое я не могу контролировать) отправляет мне запрос LPQ каждую десятую долю секунды. После 235 запросов клиент получает RST при попытке подключения. Через некоторое время устройство снова будет принимать некоторые запросы (около 300), пока снова не начнет отправлять RST.

Я подтвердил, что причиной RST является стек TCP. Есть некоторые вещи, которые я заметил.

1) Я могу немного изменить количество сокетов, которые будут приняты, если я изменю количество других запущенных приложений. Например, я освободил 4 сокета, тем самым изменив число принимаемых с 235 на 239. 2) Если я отправлю запросы на lpr (порт 515) и еще на один порт (скажем, порт 80), общее количество подключений, которые принимаются до Старт RST остается постоянным на уровне 235. 3) Есть много сокетов, ожидающих TIME_WAIT.
4) У меня фиктивная версия клиента. Если я замедляю клиент до одного запроса каждую четверть секунды, сервер не отклоняет соединения. 5) Если я замедляю ответы сервера, у меня не будет отклоненных соединений.

Итак, моя теория заключается в том, что существует некоторый общий ресурс (моя основная догадка — это общее количество дескрипторов сокетов), который VxWorks может потреблять в данный момент времени. Я также предполагаю, что это число превышает 255.

Кто-нибудь знает, как я могу заставить VxWorks принимать больше подключений и оставлять их в TIME_WAIT при закрытии? Я просмотрел конфигурацию ядра и изменил все значения, которые выглядели отдаленно вероятными, но мне не удалось изменить число.

Мы знаем, что можем установить SO_LINGER, но это неприемлемое решение. Однако это предотвращает отклонение клиентских подключений. Мы также попытались изменить значение тайм-аута для SO_LINGER. Похоже, это не поддерживается в VxWorks. Он либо включен, либо выключен.

Спасибо! Гейл


person GailG    schedule 03.10.2013    source источник


Ответы (1)


Для меня это звучит так, как будто вы устанавливаете новое соединение для каждого запроса LPQ, и после выполнения запроса вы не закрываете соединение. На мой взгляд, правильно будет принять одно TCP-соединение, а затем использовать его для получения всех запросов LPQ, однако для этого могут потребоваться модификации клиентского приложения. Чтобы избежать модификаций клиента, вы должны просто закрывать TCP-соединение после каждого запроса LPQ.

Кроме того, вы можете установить максимальное количество FD, открытых в vxworks, изменив #define NUM_FILES config.h (или configall.h, или один из этих файлов), но это просто отложит ошибку, если у вас есть утечка FD, что вы, вероятно, делать.

person Chris Desjardins    schedule 28.10.2013
comment
Привет Крис, Спасибо за совет. На самом деле у нас нет утечки; все соединения закрываются, когда мы с ними закончим. Сокет покинет TIME_WAIT через... 1 минуту. Стек TCP держит сокет открытым в ожидании задержанного сетевого трафика. Я попытался изменить NUM_FILES, но это, похоже, не изменило поведение. К счастью, мы убедили клиента изменить свое приложение, чтобы запросы выполнялись реже, что позволило нам избежать всей проблемы. - person GailG; 30.10.2013