Ограничение пропускной способности Tomcat при небольшом количестве пользователей

У нас есть веб-приложение, обслуживающее запросы для одной из наших служб. У нас он работает на сервере Tomcat 7. Как объяснено ниже, больше деталей не требуется, поскольку у нас есть аналогичные результаты с самым простым сервлетом, который мы могли бы создать.

Мы запускаем нагрузочный тест с помощью jmeter с разным количеством одновременных потоков, выполняющих запросы к нашему сервису в течение минуты. По результатам мы создаем несколько диаграмм со средним временем отклика по сравнению с параллельными потоками и количеством запросов в секунду по сравнению с параллельными потоками.

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

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

Мы также провели аналогичные тесты с Apache Benchmark, чтобы исключить проблемы с инструментом тестирования.

Тесты проводились в пуле из 2 серверов. При запуске на локальном компьютере они давали аналогичный результат, но предел пропускной способности был достигнут на уровне около 5 одновременных потоков.

Вот график пропускной способности. Обратите внимание, что значения каждой из строк не важны (например: у некоторых удален доступ к базе данных или даже у большинства логики приложения, поэтому они занимают меньше времени).

График пропускной способности

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

Спасибо, Хорхе.

PS: я бы добавил изображение вместо ссылки, но похоже, что у меня недостаточно репутации :(


person jorgelamb    schedule 28.05.2012    source источник


Ответы (2)


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

person Dylan Bijnagte    schedule 28.05.2012
comment
Спасибо за Ваш ответ. Мы попробуем запустить его на большем количестве оборудования, чтобы проверить, является ли это причиной в данном случае. Может быть, мы слишком сосредоточены на поиске причины этого ограничения около 10 одновременных потоков, когда аппаратное обеспечение является реальным ограничением. - person jorgelamb; 28.05.2012

Одной из основных причин проблем с производительностью с tomcat являются настройки jvm по умолчанию, увеличьте объем памяти, выделенный для JVM, на котором запущен tomcat, используя аргумент -Xmx.

-Xmx512m позволит выделить для кучи не более 512 МБ.

Кроме того, перед внесением изменений проверьте память, выделенную для tomcat, на странице по умолчанию tomcat > статус

а также проверить статус после увеличения размера кучи jvm.

Также увеличьте пространство perm gen, используя -XX:PermSize и -XX:MaxPermSize.

Для получения дополнительной информации посетите эту страницу.

person Rajesh Pantula    schedule 28.05.2012
comment
Это правда, что мы не указали ограничения памяти для приложения. Из аналогичных тестов, выполняемых в разных приложениях (1-минутные тесты с разным количеством одновременных потоков), мы обнаружили, что при запуске сборщика мусора данные выходили за пределы диаграммы. В этом случае нет смысла показывать такое поведение, поэтому я думаю, что GC в этом случае не проблема. Для PermGen мы обычно увеличиваем его, только если обнаруживаем OutOfMemoryErrors. Я думаю, что это мало поможет на данном этапе. - person jorgelamb; 28.05.2012
comment
Выполняете ли вы какие-либо операции ввода-вывода внутри своего сервлета, выполнение которых занимает много времени и блокирует другие потоки? если вы выполняете какую-либо операцию ввода-вывода, попробуйте перевести операции в песочницу с постоянным коэффициентом, закодировав данные, и снова запустите тесты. - person Rajesh Pantula; 28.05.2012
comment
Наше настоящее веб-приложение выполняет запросы ввода-вывода, да. Но даже после замены внешнего вызова жестко закодированными данными диаграмма выглядит похожей: предел пропускной способности все еще существует, и он достигается примерно на уровне 10 одновременных тестовых потоков. - person jorgelamb; 28.05.2012