Как правильно настроить ресурсы приложения Springboot Kubernetes?

#java #spring-boot #kubernetes #java-11

#Ява #пружинный ботинок #кубернетес #java-11

Вопрос:

Моя цель

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

Примеры

Первый пример: Пусть у вас есть приложение Springboot с низкой производительностью, которое вычисляет ключ только для кэша и вызывает Redis для данных с ключом. Я попробовал две конфигурации ресурсов и вариантов java.

 replicaCount: 4 memory: 1.9Gi cpuRequest: 800m cpuLimit: 1200m JAVA_OPTS: "-XX: UseG1GC -XX:MaxRAM=1792m -Xmx768m -Xms768m -XX:MaxMetaspaceSize=1024m -XshowSettings:vm -XX:ActiveProcessorCount=2"  

Производительность хорошая, а время отклика приложения в среднем составляет около 3,5 мс. А для 0,99 процентиля это 90 мс. Количество пауз GC составляло 0,4 в минуту, а продолжительность паузы 20 мс. Также небольшое дросселирование.

Тогда я попробовал эту настройку:

 replicaCount: 4 memory: 3Gi cpuRequest: 800m cpuLimit: 10000m JAVA_OPTS: "-XX: UseG1GC -XX:MaxRAMPercentage=80 -XX:InitialRAMPercentage=80 -XshowSettings:vm"  

Приложение было более требовательным к памяти, но время отклика было таким же, в среднем 3,5 мс. Но только на 0,99 процентиля было 72 мс. Количество пауз GC было ниже, что-то около 0,1 в минуту, а продолжительность паузы 5 мс. Регулирование во время запуска, но без регулирования во время запуска.

Второй пример: приложение Springboot с высокой производительностью, которое загружает данные из базы данных, вычисляет множество параметров, таких как расстояние между двумя точками, расчет цены для нескольких поставок, фильтрация возможных точек транспортировки или получения посылки.

Он работал на 4 VPS с 4 процессорами и 4 ГБ. Но на Kubernetes для этого требуется больше ресурсов, чем я ожидал.

 replicaCount: 4 memory: 7.5Gi cpuRequest: 2000m cpuLimit: 50000m JAVA_OPTS: "-XX: UseG1GC -XX:MaxRAMPercentage=80 -XX:InitialRAMPercentage=80 -XX: UseStringDeduplication -XshowSettings:vm"  

Performance is good, but vertical scaling was doing nothing, but only horizontal scaling provided better performance. CPU usage reported by Kubernetes is about 1 and has no throttling.

What I have done so far

  • Read multiple articles found via Google, but any not give me a proper answer or explanation.
  • I have tried various settings for CPU and memory resource limits on Kubernetes spec, but it was not doing what I expected. I expected, which is lowering response time and the ability to process more requests.
  • Scaling vertically does not help either, everything was still slow.
  • Scaled horizontally pods with low CPU and memory with specified Xms, Xmx, … it does that, pods were stable, but not performant as possible. (I think.) And also some throttling of CPU also if CPU was not fully used.

Question

I have a big problem with properly setting memory and CPU on Kubernetes. I do not understand why memory usage is increasing when I give it more CPU (Xss is the default value) and usage is the same. The pod is not OOM killed only if a gap between committed memory and used memory is about 1 GB (for the second application example) or 500MB (for the first application example).

If I set Xmx, Xms, MetspaceSite, and Xss, then I can achieve lower memory usage and CPU usage. But in this case, increasing the pod memory limit is complicated because it is not defined as a percentage and I must every time calculate each Java opt.

Кроме того, если предоставить приложению слишком много памяти, по просьбе оно запустится на каком — то уровне, но через некоторое время оно каждый раз переходит к пределу (до тех пор, пока разрыв между фиксированной и кучной памятью не составит 1 ГБ-500 МБ) и остается там.

Итак, как правильно найти оптимальные настройки ресурсов и варианты Java для приложений Springboot, работающих на Kubernetes? Должен ли я предоставить приложению большие ресурсы и через некоторое время, примерно через 7 дней, снизить его на максимальные значения по показателям?