Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java: Работа с сетью > Как правильно принимать соединение с ServerSocket |
Автор: Majesty 2.7.2010, 12:43 | ||
На яве пишу недавно и по чуть-чуть. Появилась необходимость соорудить сервер, который будет принимать соединения на указанном порту и обрабатывать запросы. Делаю так:
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 | ||||
Ну наверное там должно быть не
а
![]() В остальном все зависит от того сколько соединений вы ожидаете в среднем, сколько соединений может быть в пике, сколько потоков можно запускать на данном конкретном сервере и т.д. Для начала возьмите Java Visual VM (или любой другой профайлер который вам нравится) и посмотрите чем там вообще ваши треды занимаются и сколько их там запущенно в принципе. Если выяснится что нужно ограничть количество потоков то тут есть пара вариантов как это можно сделать. |
Автор: Majesty 3.7.2010, 12:43 |
Прогуглил, впитал, можно не отвечать. |
Автор: LSD 3.7.2010, 14:11 |
Это именно NetworkAppThread потоки или вообще все потоки? 17 потоков это не много для сервера особенно такого мощного. |
Автор: Majesty 8.7.2010, 10:04 | ||
Это все потоки моего приложения ![]() Вообще, это собственный велосипед для поиска на базе Apache Lucene. Использовать Solr не хочется из-за его монструозности. Так вот, судя по профайлеру, больше всего грузит метод ReadByte из Lucene. Есть соображение, что это я тупой и напрасно для каждого запроса вытаскиваю вообще все возможные результаты. Возможно, следует добавить в запрос некий параметр для ограничения кол-ва возвращаемых результатов, ибо чаще всего их нужно не тысячи, а всего 5. |
Автор: LSD 8.7.2010, 16:16 | ||
Ну это как посмотреть, у меня на JDK 1.6 в Hello World! 7 потоков! Один мой и 6 системных.
Ну тогда это уже вопрос не по сети. Создай новую тему и опиши там проблему, архитектуру программы и т.д. |
Автор: Majesty 12.7.2010, 12:56 |
Ок, спасибо за помощь ![]() ![]() |