Неэффективное использование процессора Tomcat
Я использую Tomcat для преобразования PDF в PNG. Я использовал Jmeter для тестирования приложения на нагрузку / пропускную способность, используя сервер Intel X (X) CPU X5550 @ 2,67 ГГц, который имеет 16 гиперпоточных ядер. Tomcat6 выделил 2 гигабайта памяти кучи, а коннектор был настроен для обработки 1000 одновременных подключений. Во время нагрузочного тестирования я обнаружил, что с увеличением количества пользователей время отклика ухудшается, что является нормальным. Однако средняя загрузка была очень низкой (около 1 для 16-ядерного компьютера), а загрузка процессора составляла около 60%. Я наблюдал за экземпляром tomcat с помощью jconsole через JMX и обнаружил, что использование памяти не является проблемой. Чтобы поддерживать низкое время отклика, я создал около 8 экземпляров tomcat на 8 разных портах, и во время моего нагрузочного тестирования балансировщик нагрузки уравновешивал нагрузку между всеми 8 портами. На этот раз я обнаружил, что сервер может обрабатывать много одновременных подключений без снижения времени отклика. Средняя нагрузка также была высокой 7. Таким образом, кажется, что tomcat не использует ЦП эффективно при установке только с одним экземпляром (я даже пытался создать несколько разъемов на разных портах).
Похоже, нам нужно запустить несколько экземпляров tomcat на одной машине, чтобы извлечь максимальную производительность. Выполнение этой настройки не является оптимальным, поскольку создание нескольких экземпляров в пуле серверов и его обслуживание будет проблематичным.
Мой вопрос заключается в том, можно ли настроить tomcat таким образом, чтобы один экземпляр использовал как можно больше процессоров с высокой средней загрузкой?
Пожалуйста, прокомментируйте, если у вас есть какие-либо вопросы о настройке.
Буду признателен за любую помощь / указатель.
1 ответ
Мне кажется, что у приложения есть узкое место. Я предполагаю, что он использует только один поток для преобразования PDF-файлов.
Tomcat запускает сервлеты параллельно, но когда сервлеты вызывают однопотоковую библиотеку, ваше веб-приложение становится однопоточным. Вы должны изменить свое приложение, чтобы использовать больше потоков.
Не слишком удачный обходной путь - запускать столько экземпляров Tomcat, сколько у вас есть ядра, и балансировать запросы к ним (как вы упомянули в вопросе).