Назад | Перейти на главную страницу

Spring Boot 1.2.7, Tomcat, CSS и Thymeleaf = Очень-очень медленная служба

У меня есть веб-приложение Spring Boot 1.2.7.RELEASE (со встроенным Tomcat), которое должно обрабатывать очень высокий всплеск нагрузки, ~ 10 тысяч соединений за 4-5 минут на одном сервере (на самом деле есть кластер серверов, но это загрузить один узел увидим).

Это действительно очень медленно. Если я попаду в него с помощью JMeter с 1000 потоков за 10 секунд, но просто с помощью простого запроса GET для страницы входа в Thymeleaf - ничего больше - средний ответ скоро превысит 13 секунд. Страница представляет собой просто форму входа в систему с использованием Thymeleaf.

Он работает на виртуальной машине с RHEL7, 32 ГБ ОЗУ (с кучей JVM, настроенной на использование 28 ГБ) и 4 ядрами ЦП. Здесь много лошадиных сил, но я изо всех сил пытаюсь заставить его реагировать под нагрузкой.

В качестве теста, чтобы уменьшить количество сокетов и потоков, я закомментировал две ссылки на странице css:

<HEAD>

    <!-- Other meta stuff omitted -->


    <!-- I commented out these next two lines -->
    <link rel="stylesheet" href="css/index.css"/>
    <link href="css/gridset.css" rel="stylesheet"/>
</HEAD>

Когда я проделал точно такой же нагрузочный тест, средний отклик составил 277 мс! Если я верну одну из них, медлительность вернется.

Таким образом, без преувеличения, время отклика на тот же тест снизилось с 13 секунд до менее 0,3 секунды.

Я попытался включить css в строку, но Spring выдает всевозможные ошибки, пытаясь его проанализировать. W3C Validator показывает, что оба файла содержат много ошибок.

Кто-то работает над исправлением ошибок в css, но мне интересно, в чем причина медлительности. Это факт, что css не работает, или это тот факт, что он обслуживается Tomcat из статической области? У меня не будет действительного css для повторного тестирования в течение нескольких дней, и я готов к этой работе.

Я ударил его с помощью firebug, и страница единого входа загружается за 437 мс. Первый файл index.css загружается за 158 мс, а файл gridset.css - за 53 мс. Затем есть 3 изображения, которые занимают в общей сложности 205 мс. Общий размер изображений составляет 19 КБ.

Выложу дамп треда ниже. Это было создано New Relic.

Я нашел некоторую информацию о том, что Tomcat медленно обслуживает статический контент, но я не могу себе представить, что это так медленно, и другие люди говорят, что последняя версия Tomcat работает так же, как httpd.

Я в первую очередь разработчик, поэтому очень признателен за любую помощь в этом, спасибо!

75% java.lang.Thread.run() :745 70% org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run() :61
 70% java.util.concurrent.ThreadPoolExecutor$Worker.run() :617
 70% java.util.concurrent.ThreadPoolExecutor.runWorker(java.util.concurrent.ThreadPoolExecutor.Worker) :1127,1142
 69% java.util.concurrent.ThreadPoolExecutor.getTask() :1066
 69% org.apache.tomcat.util.threads.TaskQueue.poll(long, java.util.concurrent.TimeUnit) :31
 69% org.apache.tomcat.util.threads.TaskQueue.poll(long, java.util.concurrent.TimeUnit) :85
 69% java.util.concurrent.LinkedBlockingQueue.poll(long, java.util.concurrent.TimeUnit) :462,474,467
 69% java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(long) :2069,2083,2078
 69% java.util.concurrent.locks.LockSupport.parkNanos(java.lang.Object, long) :215
 69% sun.misc.Unsafe.park(boolean, long) :native