У меня есть веб-приложение 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