У меня странное поведение в нашем приложении весенней загрузки:
- Фронтенд / клиент - угловой 6
- Бэкэнд - пружинная загрузка - пружина MVC - встроенный tomcat - Linux
После перезапуска серверной части первые вызовы контроллера требуют около 5 секунд, следующий же запрос занимает всего 50 мс.Это воспроизводимо в 90% случаев, иногда даже первый звонок быстрый.
Я уверен, что проблема на сервере, а не на клиенте.В браузере я вижу, что время TTFB (время до первого байта) увеличивается до 5 секунд.Следующие запросы требуют только 10 мс для TTFB.
С помощью инструментов мониторинга на сервере (динамика приложения) я могу собирать такие медленные вызовы сервера, а на графике вызовов я вижу, что:
org.apache.catalina.webresources.JarWarResourceSet:getArchiveEntries:117
необходимо 4916 мс.Так что вот мое узкое место, я думаю.Но я не знаю, как это исправить.
Что я уже пробовал:
- Переключился с hikaricp на пул соединений Apache tomcat jdbc
- Ugraded spring bootс 2.0.0 до 2.0.5
- Обновлен Java до 1.8.0_181
- Propertie spring.jpa.tomcat.testOnBorrow = true
- Propertie spring.jpa.tomcat.validationQuery= выберите 1
Все, что не влияет на задержку сервера.
Обновление
Время потеряно из-за многократного сканирования файла войныtimes.
org.apache.catalina.webresources.CachedResource.validateResource проверяет, есть ли у нас файл войны ( isPackedWarFile ), и эта проверка возвращает false.Хотя это файл войны.Для этого плохого поведения у меня есть обходной путь.Я установил tomcat.resource.cache-tt на высокое значение.
Но теперь org.apache.catalina.webresources.Cache.getResource имеет метод noCache .И в этом методе файлы class и jar исключаются из кэширования.Именно по этой причине файл war снова сканируется.
Сканирование всего файла war занимает примерно 5 секунд.И этот перерыв - остановка мирового прорыва.И это сканирование абсолютно не нужно, потому что файл войны не взорван и поэтому его содержимое не может быть изменено.
Обновление
Если я помещу файл войны в котаустановка все быстро.Проблема во встроенном коте.