Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Работа с сетью > ServerSocket.accept виснет


Автор: Anton Vatchenko 5.5.2009, 22:48
Итак, есть программа, где в отдельном потоке идет:
Код

            try {
                ServerSocket ss = new ServerSocket(12014);
                while (true) {
                    try {
                        Socket s = ss.accept();
                        s.setSoTimeout(300000);
                        // Создаем новый поток и работаем с ним
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }

            } catch (IOException e) {
                e.printStackTrace();
            }



До недавнего времени все работало хорошо, но чего-то теперь время от времени 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 или что-то подобное...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)