У меня есть сервер 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. Он либо включен, либо выключен.
Спасибо! Гейл