При условии развертывания Java микросервиса (Dropwizard) через Docker и Kubernetes.
Пример микросервиса запускается и работает без ошибок с 192Mi
HeapSize. Это определяется как базовое c требование к памяти.
Пример Dockerfile с использованием openjdk-runtime:11-hotspot
FROM some-container-reg/openjdk-runtime:11-hotspot
# prepare build
COPY --chown=1001:1001 build/install/svc-example .
COPY --chown=1001:1001 config.yml .
# exposing port(s)
EXPOSE 8080
# setting entry point...
ENTRYPOINT ["bin/svc-example", "server", "config.yml"]
Примечание: С используя openjdk > 10
, JVM обнаруживает, работает ли он в контейнере. Поэтому нет необходимости включать экспериментальные функции виртуальной машины для достижения этой цели, например, в Java 8. Подробнее см. По ссылке ниже.
https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8146115
Соответствующее развертывание k8s
resources:
limits:
cpu: 250m
memory: 288Mi
requests:
cpu: 100m
memory: 192Mi
env:
- name: JAVA_OPTS
value: "-XX:MaxRAMPercentage=75.0"
Запрос контейнера равен рабочему количеству от самого приложения java. Пределы были определены как запрос плюс смещение 96Mi
. Делая это, я хочу убедиться, что требования помимо JVM-Heap имеют достаточно ресурсов для правильной работы - MetaspaceSize, CodeCache, ...
.
Также определяя JAVA_OPTS
в пределах развертывания контейнера, применяя -XX:MaxRAMPercentage=75.0
, который определяет предел 75% общего объема памяти для JVM. Почему бы не определить явные ограничения кучи в -XX:Xmx=192Mi
? Подробнее см. По ссылке ниже.
https://bugs.openjdk.java.net/browse/JDK-8186315
Итак, теперь мои вопросы:
- Правильно ли я согласен с приведенными выше предложениями?
- Как определить пределы для достижения недорогого развертывания?
- Требуется ли применять дополнительные параметры к JVM, например
GC
или MaxMetaspaceSize
для предотвращения использования памяти сверх пределов? - Нужно ли также определять JVM-Args для Dockerfile? Точнее говоря, JVM Docker и JVM Java -Microservice одинаковы?