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


Автор: Majesty 2.7.2010, 12:43
На яве пишу недавно и по чуть-чуть. Появилась необходимость соорудить сервер, который будет принимать соединения на указанном порту и обрабатывать запросы. Делаю так:
Код
ServerSocket server_socket = new ServerSocket(port, 0, Inet4Address.getByAddress(ip));
while(true) {
    new NetworkAppThread(server _socket.accept()).start();
}
Есть ли что-то лучше, чем бесконечный цикл, для организации многопоточного сервера? Или (если нет ничего лучше) почему нельзя бить ява-программиста по голове за организацию приёма соединений через бесконечный цикл? Начальник (далёкий от явы и от программирования в целом) считает, что использование в этой ситуации бесконечного цикла - это варварское расходование ресурсов.

PS: Тема возникла из-за того, что на сервере (16 процессоров, 16 гиг оперативки, centOS 5, JRE 6) под "живой" нагрузкой приложение стало отъедать до 90% процессора (т.е. в сумме 1440% из 1600% возможных). На ноутбуке (core2duo, 2 гига оперативки, ubuntu 9.10, JRE 6) и рабочем компе (core2duo, 3 гига оперативки, Win XP sp3, JRE 6) процессор кушался на 10% в пиках (нагружал с помощью утилиты ab, которой обычно тестируют веб-сайты на стрессоустойчивость). Приложение получает соединения от php-скрипта, вызываемого пользователями сайта...

Автор: AbSs 2.7.2010, 15:31
public Socket accept()       throws IOException
    Listens for a connection to be made to this socket and accepts it.The method blocks until a connection is made. 
....

Проблема в другом. Стоит ли для каждого клиента делать отдельный поток?

Автор: LSD 2.7.2010, 15:35
Ну наверное там должно быть не
Код

while(true)

а
Код

while(running)

smile
В остальном все зависит от того сколько соединений вы ожидаете в среднем, сколько соединений может быть в пике, сколько потоков можно запускать на данном конкретном сервере и т.д.

Для начала возьмите Java Visual VM (или любой другой профайлер который вам нравится) и посмотрите чем там вообще ваши треды занимаются и сколько их там запущенно в принципе.

Если выяснится что нужно ограничть количество потоков то тут есть пара вариантов как это можно сделать.

Автор: Majesty 3.7.2010, 07:30
Цитата(LSD @  2.7.2010,  15:35 Найти цитируемый пост)
Для начала возьмите Java Visual VM (или любой другой профайлер который вам нравится) и посмотрите чем там вообще ваши треды занимаются и сколько их там запущенно в принципе.
Посмотрел на своём компе (не на сервере, поскольку к нему доступа у меня нет :(). Запущено 13-15, в пике до 17 тредов. Процессор кушается всплесками от 2-3% до 50%. Интересно, что в тредах есть ещё некие Daemon threads - 11 штук. Что это такое? smile

Автор: Majesty 3.7.2010, 12:43
Цитата(Majesty @  3.7.2010,  07:30 Найти цитируемый пост)
Что это такое?
Прогуглил, впитал, можно не отвечать.

Автор: LSD 3.7.2010, 14:11
Цитата(Majesty @  3.7.2010,  08:30 Найти цитируемый пост)
Запущено 13-15, в пике до 17 тредов.

Это именно NetworkAppThread потоки или вообще все потоки?

17 потоков это не много для сервера особенно такого мощного.

Автор: Majesty 8.7.2010, 10:04
Цитата(LSD @ 3.7.2010,  14:11)
Это именно NetworkAppThread потоки или вообще все потоки?

Это все потоки моего приложения smile Не только те, которые занимаются обработкой запроса. Впрочем, других потоков у него всего пара.

Вообще, это собственный велосипед для поиска на базе Apache Lucene. Использовать Solr не хочется из-за его монструозности. Так вот, судя по профайлеру, больше всего грузит метод ReadByte из Lucene. 

Есть соображение, что это я тупой и напрасно для каждого запроса вытаскиваю вообще все возможные результаты. Возможно, следует добавить в запрос некий параметр для ограничения кол-ва возвращаемых результатов, ибо чаще всего их нужно не тысячи, а всего 5.

Автор: LSD 8.7.2010, 16:16
Цитата(Majesty @  8.7.2010,  11:04 Найти цитируемый пост)
Впрочем, других потоков у него всего пара.

Ну это как посмотреть, у меня на JDK 1.6 в Hello World! 7 потоков! Один мой и 6 системных.


Цитата(Majesty @  8.7.2010,  11:04 Найти цитируемый пост)
Вообще, это собственный велосипед для поиска на базе Apache Lucene. Использовать Solr не хочется из-за его монструозности. Так вот, судя по профайлеру, больше всего грузит метод ReadByte из Lucene. 

Есть соображение, что это я тупой и напрасно для каждого запроса вытаскиваю вообще все возможные результаты. Возможно, следует добавить в запрос некий параметр для ограничения кол-ва возвращаемых результатов, ибо чаще всего их нужно не тысячи, а всего 5.

Ну тогда это уже вопрос не по сети. Создай новую тему и опиши там проблему, архитектуру программы и т.д.

Автор: Majesty 12.7.2010, 12:56
Ок, спасибо за помощь smile  smile 

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