Поведение тайм-аута неблокируемого сокета Java Linux - PullRequest
4 голосов
/ 21 июня 2009

У меня есть Java-неблокирующий сервер, который отслеживает все каналы сокетов в селекторе. Затем я устанавливаю 500 соединений с сервером и регулярно отправляю данные. Каждый фрагмент данных, который получает сервер, возвращается клиенту.

Проблема возникает, когда тест прекрасно работает в течение пары часов, а затем внезапно все сокеты, которыми управляет сервер, выдают исключение IOException для тайм-аута соединения при попытке прочитать данные.

Я изучил, не истощался ли поток клиента (и не отправлял ли он данные), но я уступаю потоку клиента, который перебирает все сокеты и записывает данные. Движение, кажется, постоянно течет нормально, но через некоторое время все просто вымирает. Есть идеи, что может быть причиной такого поведения?

Я работаю на платформе Linux с последней версией Java 6. Мое приложение запускает два потока: один для сервера и один для всех клиентов. Заранее спасибо!

Дополнительно: Проблема касается Linux, а не моего кода. Когда я запускаю точно такую ​​же настройку на Windows-боксе (на том же оборудовании), он никогда не истекает, но через несколько часов они начинают происходить в Linux. Это должно быть какая-то настройка TCP в Linux, которая вызывает это. Спасибо за предложение.

Ответы [ 3 ]

1 голос
/ 26 июня 2009

Проблема связана с Linux, а не с моим кодом. Когда я запускаю точно такую ​​же настройку на Windows-боксе (на том же оборудовании), он никогда не истекает, но через несколько часов они начинают происходить в Linux. Это должно быть какая-то настройка TCP в Linux, которая вызывает это. Спасибо за предложение.

0 голосов
/ 04 июля 2009

Таким образом, как в случае, когда работает (Windows с недавней JVM), так и в случае, когда (Linux с недавней JVM) не работает, сервер и клиент находятся на одной машине в одной и той же JVM?

Можете ли вы уточнить, что означает "внезапно постепенно"? Мол, через несколько часов - и всегда одинаковое количество часов - затем через несколько секунд все сокеты на стороне сервера выдают исключения?

Вы не упоминаете клиентский поток, считывающий возвращаемые данные. Возможно, это остановлено, и вы не заметили. (Что делает поток клиента, когда поток сервера обнаруживает 500 быстрых исключений? Попробуйте несколько дампов стека подряд, чтобы увидеть.)

0 голосов
/ 23 июня 2009

Опция -doCloseWithReadPending в Java и JRE версий 1.5 или 5.0 позволяет одному потоку закрывать сокет, когда в этом же сокете ожидается чтение из другого потока.

Когда метод close () вызывается для сокета, у которого есть ожидающий вызов чтения из другого потока, метод close () по умолчанию блокирует сокет до завершения вызова чтения.

При использовании опции -doCloseWithReadPending вызов сокета close () закрывает сокет, а в контексте потока с ожидающим чтением генерируется исключение SocketException с сообщением «Socket closed».

Я не знаю, является ли это основной причиной вашей проблемы, не видя код, но я подумал, что добавлю это здесь, если это повлияет на вашу проблему.

...