Здравствуйте!
Имеется проблема, которая уже вынесла мне весь мозг..
Суть в следующем: когда мое приложение на java 8 запускается оно сразу же создает 800 подключений на удаленный сервер(к нему доступа нет), в новых потоках - потоки создаются нормально, подключения тоже все подключаются (метод connect не выбрасывает исключений никаких).
Комманда netstat | grep 4444 | grep ESTABLISHED | wc -l выводит 800(т.е. все соеденения успешно установлены).
В новом потоке в цикле вызывается блокирующий read, который ждет пакет такого типа:
*длина данных* *данные соб-сно*
.
Теперь проблема:
Не во все подключения приходят ответы с сервера.
Схема взаимодействия клиента с сервером: клиент шлет пакет 42 байта на серв, серв отвечает 1502 байта.
На практике, все пакеты из клиента ушли(вероятно, т.к. write не выбросил IOException), но ответы пришли в лучшем случае в 500 подключениях, остальные повидимому заблочились на read..
Как это можно отдебажить? Пните в нужную сторону плиз..
Или возможно подскажите, какие опции сокету поставить, чтобы был ответ.
П.с. к удаленному хосту доступа не имею. Могу дебажить только от клиента...
Заранее спасибо за ответы!!
Хм, а если, скажем, только 100 потоков запустить? Тоже не все будут работать?
Можно попробовать посмотреть какие пакеты реально идут с сервера с помощью tcpdump или чего-то подобного.
если 40 запускать, то есть шанс, что все запустятся..
если 100, то как и с 400(
Прикол в том, баг возникает, когда висят куча подключений не закрытых в WAIT_TIME...
Ну и по хорошему, при работе с сотнями соединений стоит использовать какое-то асинхронное API. К сожалению я не большой специалист в Java, но возможно вы потратили всю память и с JVM случилось что-то плохое (странно что все просто не упало). www.mailinator.com/tymaPaulMultithreaded.pdf тут пишут что несколько сотен тредов это предел.
Потоки в java создаются, на jvm 8 гб ОЗУ выставлено, тут все ок.
Подключения тоже установлены - все, через netstat это видно (везде ESTABLISHED)...
но вот ответа нет..
=======================================++
!!!!!!!!!!!!!!!!! Важно, когда возникает баг:
Запустил 1 раз - все потоки стартанули и подключения подключились, завершил приложение - все подключения перешли в WAIT_TIME.
Опять запускаю - работает половина.
Жду пока уйдут все подключения с WAIT TIME, запускаю - работает)
Короче ошибка возникает из-за tcp previous segment not captured и out-of-order , кто знает как пофиксить:?
Илья: получается такая фишка:
запустил 1 раз 100 клиентов, создалось 200 подключений - все удачно, успешно нормально работет. Как и ожидается.
запустил 2 раз: тоже 100 клиентов, тоже 200 соеденений, все подключились, пакеты 42 байта ушли в том количестве, в котором нужно. НО! с сервака сразу приходят пакеты RST в кол-ве 50 штук и затем FIN -> ACK....
Это антиддос режет или файрвол, у меня режет или на сервере??
Илья: а что там можно криво реализовать? Все как надо..
Пробовал даже такое: перед конектом слип в 1 сек, после конекта слип,
шлю данные, слип, звоню available на input stream, там пусто(
Если заюзать nio проблема отпадет? или нет?
synapse_people: По стандарту отправитель и\или маршрутизатор-посредник может пустить трафик имеет нка свое усмотрение пакеты по необходимости доставить в любом удобном ему порядке. Дальше это проблема собирающей стороны.
Кеширование используете? Попробуйте, если нет. Может быть, помогут и не блокирующие соединения из NIO/NIO.2
olexande: нашел косвенную причину сего:
запускаю 400 потоков: из них подключились ВСЕ, данные пришли только в 207.
После того, как я убил JVM посыпалось 193 пакета с флагами RST(это не совпадение - проверил несколько раз). Остальные, в те, что пришли данные, послали FIN + ACK..
Может роутер виноват?
Плиз помогите кто знает