JBOSS зависает при достижении предела maxThreads

У меня есть приложение Struts 1.3, работающее в JBOSS AS 5.1. Мы установили 2000 потоков HTTP в файле server.xml для HTTP-коннектора и выделили около 2 ГБ ОЗУ в куче JVM для JBOSS в файле run.conf. Система имеет в общей сложности 4 ГБ ОЗУ, а оставшаяся часть ОЗУ используется другими приложениями.

Всякий раз, когда моя система получает более 2000 одновременных запросов, Jboss просто зависает и перестает работать. Я не получаю исключений на консоли или каких-либо ошибок нехватки памяти, он просто зависает.

Как решить эту проблему? Должен ли я поставить mod_cluster или что-то еще перед JBOSS? Или я должен просто выделить больше потоков для соединителя, если да, то как мне выяснить, какое соотношение использовать между памятью и maxThreads на соединителе HTTP?


person user1266369    schedule 13.03.2012    source источник


Ответы (1)


2000 — это очень большое число. Если вам действительно нужно, чтобы он обрабатывал 2000 одновременных запросов, вам нужно будет настроить несколько экземпляров и равномерно распределить нагрузку между экземплярами. Вы можете настроить балансировщик нагрузки или apache+mod_jk перед jboss.

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

person souser    schedule 13.03.2012
comment
Вы имеете в виду установку нескольких экземпляров в одной системе? Если да, то почему это было бы выгодно по сравнению с одним запущенным экземпляром JBOSS? Это корпоративное веб-приложение, поэтому нам нужно работать с 2000+ пользователями. Также не могли бы вы порекомендовать какой-нибудь инструмент, который я мог бы использовать, чтобы выяснить, сколько памяти использует каждый компонент моего приложения? - person user1266369; 14.03.2012
comment
@user1266369 user1266369 Вам не нужно 2000 потоков коннектора для обработки 2000 пользователей. Если приложение не очень активно использует сеть, 200, вероятно, более реалистично. Для большей пропускной способности поможет больше оперативной памяти/кучи, и существует множество способов настроить коннектор для повышения производительности. - person Michael; 14.03.2012
comment
Если это корпоративное веб-приложение, вам не нужен один экземпляр, обслуживающий всех пользователей. Что происходит, когда этот единственный экземпляр выходит из строя? Аварийное переключение определенно является одной из причин для установки нескольких экземпляров. Кроме того, если загрузка процессора на одном из серверов растет, вы всегда можете поднять другой сервер и переместить второй экземпляр на этот сервер. - person souser; 14.03.2012
comment
Инструменты, которые я использовал для анализа использования памяти для Sun JDK, — это файлы журналов verbosegc, jconsole и иногда visualvm. Но я не думаю, что они предоставляют детали, которые вы просили. - person souser; 14.03.2012
comment
@Mikaveli Насколько я знаю, каждый новый URL-адрес моего веб-приложения, который обращается к моему сервису JBOSS, будет обрабатываться в новом потоке соединителя HTTP до тех пор, пока не будет выпущен предыдущий поток. Насколько я понимаю, если в веб-приложении много одновременного трафика, это заставляет систему использовать больше потоков из соединителя. Как в этом случае вы заставляете 200 потоков работать на 2000 пользователей? - person user1266369; 15.03.2012
comment
@Kevin Я использовал visualvm, но, кажется, там слишком много данных, чтобы действительно сосредоточиться на том, какой из моих классов использует больше памяти, чтобы придумать правильное соотношение чего-то вроде 1 потока на y МБ памяти в куче. . - person user1266369; 15.03.2012
comment
Вчера мы использовали mod_cluster, который должен быть новым балансировщиком нагрузки вместо mod_jk перед JBOSS, но, похоже, у нас возникла та же проблема с сервером HTTPD. Когда я нажимаю на сервер HTTPD больше, чем значение параметра MaxClients, используя Jmeter, он тоже зависает, как JBOSS. Моя тестовая конфигурация httpd для maxclients: ServerLimit 20, MaxClients 500, MinSpareThreads 25, MaxSpareThreads 75, ThreadsPerChild 25. - person user1266369; 15.03.2012
comment
Если вы ожидаете 2000 одновременных подключений, вам необходимо установить для MaxClients такое же число; а в идеале даже выше. - person souser; 15.03.2012
comment
@user1266369 user1266369 Это не так, представьте, что разъемы больше похожи на полосу на автомагистрали / автостраде. Транспортные средства представляют собой запросы к вашему приложению (скрипты, изображения, динамические данные и т. д.). Пока пользователь использует приложение, минутные паузы между запросами и операциями позволяют другим пользователям использовать тот же соединитель. - person Michael; 15.03.2012
comment
@Mikaveli Мое веб-приложение не является веб-сайтом, поэтому в нем нет изображений и т. Д. Это просто с точки зрения URL-адресов нашего приложения, мы пишем запрос в БД или обрабатываем его соответствующим образом с точки зрения классов действий Strut, выполняющих свою работу. Когда мы запускаем нагрузочный тест с JMeter с 2000 потоков, пока я не установлю для своего HTTP-коннектора это значение или выше, похоже, что он не обрабатывает всю нагрузку. - person user1266369; 15.03.2012
comment
@ Кевин, правда, 500 были просто тестовым сценарием. Однако почему он висит? Это потому, что я не выделил достаточно памяти, то есть у меня слишком много MaxClients, чем HTTPD может поддерживать с доступной системной памятью? - person user1266369; 15.03.2012
comment
Когда MaxClients будет достигнуто, это будет указано в файлах журнала. Что касается использования памяти, вам действительно нужно будет следить за своей системой, чтобы узнать. - person souser; 15.03.2012