Dockerized Spring Boot приложение на k8s занимает почти всю доступную память - PullRequest
0 голосов
/ 31 октября 2018

У меня есть простое приложение Spring Boot, развернутое на k8s (2 модуля). Вкратце описанное приложение принимает сообщения от производителя и обрабатывает их для потребителя. Ничего сложного.

UPD:

  • Java-версия: 1.8.172
  • javaMemoryOpts: -Xmx2048m -XX: + UnlockExperimentalVMOptions -XX: + UseCGroupMemoryLimitForHeap

memory monitoring Это потребление памяти для одного из 2 под.

  • синяя линия - запрашиваемая память k8s
  • оранжевая линия - рабочий набор
  • зеленая линия - использование услуги
  • желтая линия - ограничение памяти по k8s

Проблема заключается в большом использовании памяти, несмотря на простоту обслуживания. Я бы профилировал приложение, но с сервисом все нормально: всего около 60 потоков, нет утечек памяти и так далее.

Используемая память никогда не превышает ограничение k8s, даже если оно очень близко к нему (без OOM). Конечно, я могу добавить больше стручков, и потребление станет равномерным, но я думаю, что это не правильный путь.

Одна вещь, которая меня смущает, почему используемая память всегда выше, требуется даже при запуске.

На самом деле, я не знаю, что с ним не так. У кого-нибудь есть идеи или, может быть, вы знаете, как уменьшить использование памяти приложением?

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Ответ от mk_sta полезен, и вся необходимая информация, вероятно, содержится в этих документах, но я считаю, что в полном ответе стоит обобщить основные моменты.

Ваш параметр -Xmx2048m (2 ГБ) устанавливает максимальный размер кучи, но приложение будет использовать больше памяти, чем это - Metaspace, сборщик мусора и много других служебных данных (это память «вне кучи»).

Независимо от того, насколько просто ваше приложение, Java будет использовать доступный размер кучи. Трехстрочное приложение, выводящее случайные строки, если ему выделена куча в 2 Гб, в конечном итоге будет использовать все это. Так что не имеет значения, если ваше приложение Spring Boot «простое» - куча будет расти, пока не достигнет максимума, и тогда вы увидите сборку мусора - это зубчатые зубы на вашей зеленой линии.

Таким образом, эти две вещи вместе, вероятно, объясняют, почему вы видите верхнюю границу использования памяти около 3,8 ГБ.

Графики, которые вы строите, вероятно, показывают приложение с хорошим поведением, так что перестаньте беспокоиться об утечках памяти. Я не могу сказать по картинке, если это небольшие или крупные коллекции. Т.е. по картине я не могу понять, как мало вы можете рискнуть сжать Xmx.

Несмотря на то, что вы говорите, что приложение Spring Boot «простое», невозможно узнать, не увидев, насколько оно сложное на самом деле. Но документ со ссылкой на mk_ska здесь ...

https://github.com/dsyer/spring-boot-memory-blog/blob/master/cf.md

... очень полезен, потому что показывает некоторые хорошие настройки по умолчанию для "небольших" приложений Spring Boot - например, приложение, использующее Freemarker для генерации нестатического контента, может успешно работать с кучей 32 МБ.

Так что простой ответ - попытаться уменьшить ваш -Xmx до минимального значения, прежде чем вы увидите, что сборщик мусора ломится. Вы также можете получить его до 32 МБ.

Затем вы можете использовать эти результаты, чтобы установить некоторые разумные значения для предела ресурса и запроса ресурса в ваших манифестах K8S. Вам понадобится намного больше, чем, например, 32 МБ размера кучи - как указано в этом документе, загрузочные приложения Spring намного лучше с объемом контейнера 512 МБ или 1 ГБ. Вы могли бы обойтись с 256 МБ, но это сложно.

0 голосов
/ 31 октября 2018

Как правило, Kubernetes представляет запросы и ограничивает механизмы для управления ресурсами (ЦП, память). Миссия Requests направлена ​​на обеспечение достаточного количества ресурсов для контейнера внутри кластера Pod. Ограничения гарантируют, что контейнер никогда не достигнет определенного значения для определенного ресурса. Пройдите тур и посетите следующие статьи:

Настройка JVM - довольно сложный процесс для достижения хороших результатов и достаточного уровня использования вычислительной системы. Я бы порекомендовал просмотреть следующие веб-ссылки на эту тему:

...