Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java: Работа с сетью > ServerSocket.accept виснет |
Автор: Anton Vatchenko 5.5.2009, 22:48 | ||
Итак, есть программа, где в отдельном потоке идет:
До недавнего времени все работало хорошо, но чего-то теперь время от времени accept висит, и через telnet все висит (показывает, что соединение установлено, но на самом деле дальше accept дело не идет). Потом где-то через пару минут (если повезет) accept принимает соединение. Все это работает под Fedora Core 5, и не ясно в чем проблема. Что самое интересное, что на том же сервере стоит программа с таким же циклом, правда на другом порту (12015), и принимает соединения на порядок быстрее. Может кто-то как-то что-то ломает, но загрузка процессора на нуле, как и оперативка... Добавлено через 3 минуты и 47 секунд Что самое интересное, уже несколько раз менял номер порта. Буквально на неделю помогает - толпа людей скачивает новый клиент и начинается все снова. Странно. Иногда выдерживает 100-150 людей (соединений-потоков), а вот сейчас еле вытягивает 12 человек. Я точно знаю, что около 50 человек пытаются соединиться, а он принял одного, висит секунд 10, принял другого, подумал секунд 30, еще принял. Уже и сервер перезапускал - ничего не помогает. Не ясно, то-ли какая-то особенность java (не справляется с большим наплывом людей), то-ли кто-то что-то атакует. |
Автор: Vurn 6.5.2009, 16:21 |
Я бы сначала делил на две части возможных проблем (а) серверсокет глюкает, не принимае коннект (б) виснет в части создания треда под вновь принятый коннект Выяснял бы тупо - выключил бы всю логику обработки сокетов (создание тредов и т.п.) и устроил бы стресс-тест по подключениям. Если работает быстро на порту - смотрел бы код обслуживания сокетов, затык в нем. Профайлером бы проверил в каком участке вешается. Добавлено через 3 минуты и 18 секунд Еще бы подумал - может передалаться на NIO? Может обвязаться вокруг Apache MINA? |
Автор: Anton Vatchenko 6.5.2009, 17:12 |
Так я и указал, что виснет сам accept. Другими словами перед ним и после него выставил System.out.println. Может было бы лучше и NIO, но хотелось бы разобраться. |
Автор: COVD 6.5.2009, 17:55 |
В NIO тот же самый accept. Проверьте, закрываются ли ранее созданные соединения. |
Автор: Anton Vatchenko 6.5.2009, 18:09 |
Я, можно сказать, стартую сервер с нуля. То есть сделал reboot, сразу запустил два приложения на разные порты. Одно работает, другое - тормозит. Да и то, что тормозит, там во втором потоке другой порт прослушивается - тоже без задержек. |
Автор: COVD 6.5.2009, 18:26 |
Можно анализатором трафика (Wireshark например) посмотреть соединения на проблемный порт извне. Но проще запустить тоже приложение на другом компьютере или на том же компьютере, но на другом порту и подсоединиться извне. Это позволит убедиться, что в самом приложении нет ошибок. Или попробовать подсоединиться с локального клиента, чтобы исключить влияние внешней сети. |
Автор: Anton Vatchenko 7.5.2009, 00:20 |
Да, я писал, что меняю порт, и помогает на некоторое время. Появились подозрения: 1. Больной хостер. Хотя кому надо через некоторое время заставлять порты подвисать как-то... 2. Особые клиенты. Может злоумышленники, может я чего-то не знаю (как в свое время не знал, что write не такая уж быстрая функция). Также что-то слышал о статусе CLOSE ON WAIT или что-то подобное... |