#java #spring #kubernetes
Вопрос:
У меня есть простое java-приложение с контроллером, которое просто возвращает jsp hello world. Он работает, как и ожидалось, при развертывании в среде, отличной от k8s, однако при развертывании на k8s требуется около 15 секунд, чтобы ответить при первом запросе страницы. После первого запроса производительность возвращается к нормальному ответу за долю секунды. Я включил журналы отладки для spring, но там нет ничего полезного, всего 15 секунд без журналов:
2021-08-04 16:38:16,856 DEBUG org.springframework.web.servlet.view.InternalResourceView: Forwarding to [/WEB-INF/jsp/test.jsp]
...
2021-08-04 16:38:31,452 DEBUG org.springframework.security.web.header.writers.HstsHeaderWriter: Not injecting HSTS header since it did not match the requestMatcher org.springframework.security.web.header.writers.HstsHeaderWriter$SecureRequestMatcher@5073a20b
2021-08-04 16:38:31,453 DEBUG org.springframework.security.web.context.HttpSessionSecurityContextRepository$SaveToSessionResponseWrapper: SecurityContext is empty or contents are anonymous - context will not be stored in HttpSession.
2021-08-04 16:38:31,455 DEBUG org.springframework.orm.jpa.support.OpenEntityManagerInViewInterceptor: Closing JPA EntityManager in OpenEntityManagerInViewInterceptor
2021-08-04 16:38:31,459 DEBUG org.springframework.web.servlet.FrameworkServlet: Completed 200 OK
2021-08-04 16:38:31,459 DEBUG org.springframework.security.web.access.ExceptionTranslationFilter: Chain processed normally
2021-08-04 16:38:31,460 DEBUG org.springframework.security.web.context.SecurityContextPersistenceFilter: SecurityContextHolder now cleared, as request processing completed
Мне было интересно, есть ли у кого-нибудь какие-либо советы о том, что может происходить, или как я мог бы продолжить расследование?
Комментарии:
1. Трудно сказать, почему вы видите это только в развертывании K8S. Я подозреваю, что в вашей среде, отличной от K8S, ваше приложение разогревается перед принятием запросов (просто догадываюсь). В любом случае, вы можете настроить свой контейнер с помощью функции готовности для выполнения первоначального запроса. Это гарантирует, что вашим пользователям никогда не придется испытывать эту задержку при первоначальных запросах.
2. Возможно, у вас есть настройка кэша в сетевом хранилище файлов, что может привести к замедлению. попробуйте отключить кэширование ответов и посмотрите, поможет ли это.
3. Является ли ваше приложение задушенным k8s? Существует высокая вероятность того, что по первому запросу будет создано несколько пулов (потоков, подключений к БД), и вашим приложениям потребуется больше ресурсов на этапе прогрева. В зависимости от ваших ограничений приложение регулируется и, следовательно, работает медленнее в k8s по сравнению с env без k8s. Проверьте показатели k8s, например, процессор, регулирование процессора, количество потоков, память и другие показатели, связанные с jvm/стеком.
4. Пожалуйста, покажите конфигурацию развертывания/replicaset/pod yaml и балансировщика нагрузки/входа