Многопоточный сокет-сервер Java зависает после получения ~ 50 одновременных подключений - PullRequest
3 голосов
/ 24 января 2011

Так что в принципе проблема описана в заголовке.Сервер работает следующим образом:

  • Прослушивает новое соединение
  • После запроса соединения - добавляет запрос к Q,
  • Продолжает прослушиваниеновое соединение
  • Отдельный процесс заботится о Q и порождает новый поток для обработки запросов клиентов.

Код сервера аналогичен этому учебному пособию (все в try / catch, к сожалению, я не могу показать исходный код - политику компании)

Вроде работает очень хорошо, пока количество клиентов не превышает ~ 50, потом просто зависает без исключений/ Предупреждения / и т.д. Существует ограничение потока ЦП 32 КБ, нет ограничений на количество открытых файлов / открытых сокетов / и т. д. OS = CentOS 5.5 (то же самое происходит в Ubuntu Tho).Сервер регистрирует данные в MySQL, используя ODBC.Отдельные стресс-тесты обоих показали, что у меня может быть до 32 тыс. Java-процессов (ограничено / proc / sys / kernel / threads-max), а MySQL может выполнять до 20 тыс. Простых операций в секунду, поэтому я предполагаю, что проблема с сокетами.

Таким образом, вопрос на самом деле таков:

  • Каков ограничивающий фактор в сокетных соединениях и как я могу увеличить его?
  • ИЛИ Я смотрю вне то место?

Ответы [ 2 ]

5 голосов
/ 24 января 2011

Скорее всего, вы создали тупик где-то в коде. Ключевым индикатором здесь является то, что, если под «зависанием» вы подразумеваете, что загрузка ЦП сервера падает до нуля, и на сервере больше не наблюдается никаких действий.

Когда сервер зависает, запустите jdk tool: jstack против его процесса. Это должно показать вам, что ждет на каком замке. Также в наборе инструментов есть jvisualvm , и если на коробке с Unix простой kill -3 pid сделает дамп потока в stderr.

Без кода или, по крайней мере, воспроизводимого примера, боюсь, я не могу помочь намного больше. Одна вещь, на которую вы, возможно, захотите взглянуть, - это использование jetty в качестве встроенного сервера вместо ручного, они уже прошли через тупик / поточность, поэтому вам не нужно.

0 голосов
/ 24 января 2011

Не знаю, поможет ли это вам и используют ли вы его, но попробуйте запустить сервер сокетов с помощью переключателя Java " -server ", это выберет виртуальную машину Java HotSpot Server. -server включает оптимизирующий JIT вместе с несколькими другими настройками «серверного класса». Как правило, вы получаете лучшую производительность из этой настройки. ВМ по умолчанию - -client.

Также проверьте другие параметры, чтобы ваш сервер сокетов не работал с минимальными ресурсами
Хорошего дня

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...