Упрощение JVM с помощью службы Docker и Azure Kubernetes

#java #node.js #spring-boot #jvm #microservices

#java #node.js #весенняя загрузка #jvm #микросервисы

Вопрос:

У меня небольшая проблема. Я создаю приложение Java Spring, но когда я пытаюсь запустить его в службе Azure Kubernetes (AKS) с помощью Docker, оказывается, что оно использует много системных ресурсов (ОЗУ, процессор являются основными соображениями). Помимо самого Spring, код довольно легкий, поэтому я не понимаю, почему он использует так много системных ресурсов. Есть ли какие-либо рекомендации, о которых я должен знать, чтобы уменьшить объем системных ресурсов моего приложения Java Spring?

Цель приложения — использовать упрощенный CRUD-сервис поверх базы данных MongoDB. Уровень взаимодействия с БД использует Spring Data или Morphia для прямых операций с БД (более старые приложения используют Morphia, более новые разработки используют Spring Data, в некоторых местах при необходимости используется QueryDSL).

В частности, метрика, с которой я сравниваю, — это NodeJS, поэтому я хотел бы, чтобы мое Java-приложение работало на уровне, сопоставимом с узловым приложением аналогичного размера / объема.

Спасибо!

Dockerfile (некоторые параметры отредактированы):

 FROM openjdk:8-jre-alpine

RUN mkdir /[redacted]
ADD *.jar /[redacted]

ENV JVM_OPTS="-Xmx256M"
ENV JVM_ARGS="-Dspring.profiles.active=[redacted]"

EXPOSE 8080

ENTRYPOINT [ "sh", "-c", "java $JVM_ARGS $JVM_OPTS -jar /[redacted]" ]
  

Единственное, что делает параметр Spring profile, — это задает набор настроек, необходимых для бизнес-логики приложения. Он ничего не устанавливает для JVM.

Комментарии:

1. Какие ресурсы, оперативная память, процессор, операции ввода-вывода? Какой тип рабочего процесса, вычисления с интенсивным использованием процессора или маршрутизация сетевых запросов? Обратите внимание, что JVM разогревается с течением времени из-за JITing кода, в нем нет всех оптимизаций с самого запуска.

2. @KarolDowbecki добавил некоторую дополнительную контекстную информацию. Помогает ли это прояснить ситуацию?

3. Извините, но это слишком расплывчато, вам нужно разобраться в настройке и посмотреть, на что тратится время в каждом конкретном случае. Служба NodeJS может не выполнять сериализацию полезной нагрузки при работе с MongoDB. Поймите, на что тратится время службой Java, и сравните его с сервисом NodeJS.

4. @KarolDowbecki Извините, у меня нет опыта в бенчмаркинге. Можете ли вы дать несколько советов о том, как получить эту информацию? Предоставляет ли Java это как стандартное ведение журнала или мне нужно работать, чтобы получить его?

5. Мой коллега (на самом деле мой босс) провел некоторое исследование и заявил, что обнаружил (не уверен, насколько он заслуживает доверия), что дополнительное использование ресурсов исходит от самой JVM, а не от кода. Поэтому он дал указание не использовать какие-либо технологии на основе JVM (кроме Scala, по какой-то причине …); Я хотел бы показать ему, что проблема не в технологии, а в том, что мы должны улучшить реализацию.