@synapse_people

Почему лагает чтение из сокета TCP в Java?

Здравствуйте!
Имеется проблема, которая уже вынесла мне весь мозг..
Суть в следующем: когда мое приложение на java 8 запускается оно сразу же создает 800 подключений на удаленный сервер(к нему доступа нет), в новых потоках - потоки создаются нормально, подключения тоже все подключаются (метод connect не выбрасывает исключений никаких).
Комманда netstat | grep 4444 | grep ESTABLISHED | wc -l выводит 800(т.е. все соеденения успешно установлены).
В новом потоке в цикле вызывается блокирующий read, который ждет пакет такого типа:
*длина данных* *данные соб-сно*
.

Теперь проблема:
Не во все подключения приходят ответы с сервера.
Схема взаимодействия клиента с сервером: клиент шлет пакет 42 байта на серв, серв отвечает 1502 байта.
На практике, все пакеты из клиента ушли(вероятно, т.к. write не выбросил IOException), но ответы пришли в лучшем случае в 500 подключениях, остальные повидимому заблочились на read..

Как это можно отдебажить? Пните в нужную сторону плиз..
Или возможно подскажите, какие опции сокету поставить, чтобы был ответ.

П.с. к удаленному хосту доступа не имею. Могу дебажить только от клиента...
Заранее спасибо за ответы!!
  • Вопрос задан
  • 835 просмотров
Пригласить эксперта
Ответы на вопрос 3
tsarevfs
@tsarevfs
C++ developer
Хм, а если, скажем, только 100 потоков запустить? Тоже не все будут работать?
Можно попробовать посмотреть какие пакеты реально идут с сервера с помощью tcpdump или чего-то подобного.
Ответ написан
@synapse_people Автор вопроса
Потоки в java создаются, на jvm 8 гб ОЗУ выставлено, тут все ок.
Подключения тоже установлены - все, через netstat это видно (везде ESTABLISHED)...
но вот ответа нет..
=======================================++
!!!!!!!!!!!!!!!!! Важно, когда возникает баг:
Запустил 1 раз - все потоки стартанули и подключения подключились, завершил приложение - все подключения перешли в WAIT_TIME.
Опять запускаю - работает половина.
Жду пока уйдут все подключения с WAIT TIME, запускаю - работает)

Короче ошибка возникает из-за tcp previous segment not captured и out-of-order , кто знает как пофиксить:?
Ответ написан
@olexande
Не пробовали для тестов создать свой тестовый сервер, который, например просто печатал-бы все запросы в консоль?

Соединения закрываете или повторно используете? Этот момент логики пробовали менять? Поддерживает-ли ее серверная часть?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы