#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, по какой-то причине …); Я хотел бы показать ему, что проблема не в технологии, а в том, что мы должны улучшить реализацию.