2009-06-21 3 views
4

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

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

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

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

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

+0

У вас есть код для показа нам? –

+1

Также вывод клиента и сервера 'netstat -a on'? Любые сокеты в несчастливом состоянии? –

+0

Не могли бы вы вывести вывод ex.printStackTrace() этого IOException? – nos

ответ

0

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

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

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

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

1

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

+0

Вы видели Криса и мои комментарии? Нам нужна дополнительная информация. –

+0

Я переместил эту информацию на вопрос - это, вероятно, не должно быть ответом –

0

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

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

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

+0

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

+0

Проблема существует на клиентах, потому что сервер получает -1, который, насколько я знаю из просмотра документации, означает, что клиент полностью отключает сокет. Сервер работает с жизнью. – user126368

+0

Я бы не предполагал, что -1/EOF означает чистое завершение работы - только поток чтения заканчивается по любой причине. В своем первоначальном отчете сервер обнаружил исключения; вы сейчас говорите, что нет? Пожалуйста, ответьте на другие вопросы от всех, если вы хотите разрешить это. (1) код; (2) вывод нетстата; (3) Убедитесь, что клиент и сервер работают в одной JVM в обоих случаях; (4) Свалки (SIGQUIT/Ctrl-Break) в течение рабочего периода и сразу после. Фактический стек ошибок также поможет, и вы должны проверить, показывает ли один сокет те же проблемы. – gojomo

 Смежные вопросы

  • Нет связанных вопросов^_^