Как найти максимальную память для стручка? - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть приложение JVM, работающее в kubernetes.Когда я запускаю kubectl top pod, я вижу следующее

mypod1                    12m          6035Mi
mypod2                    11m          6129Mi
mypod3                    11m          6334Mi

Я хотел бы узнать, хороша ли эта память 6 ГБ или плохая.Мой yaml для развертывания в kubernetes не указывает никаких ресурсов

Вопросы

  • Как узнать максимальное число, на которое он может добраться?
  • Как я могу узнать, хорошо ли работает jvm?
  • Существует ли профилировщик, который я могу подключить к jvm, работающему в модулях?

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

Вопрос № 1: «Как я могу узнать максимальное число, до которого оно может добраться?»A: Без resources, настроенного в развертывании, модуль будет иметь класс QoS BestEffort и может использовать столько памяти, сколько доступно на узле, на котором он работает.См. Также мой ответ на этот вопрос: Как узнать, сколько оперативной памяти имеет мой модуль Kubernetes?

Всегда полезно, по крайней мере, указывать min (-Xms) и max (-Xmx) куча JVM ...

Вопрос № 2: "Как я могу узнать, хорошо ли работает jvm?"О: Вы можете начать с включения JMX, а затем использовать его для сбора метрик JVM и приложений.Помимо мостов JMX-HTTP, таких как Jolokia и Prometheus JMX Exporter , существует также возможность прямого подключения через JMX.Один из способов:

  • Предоставить JMX, сконфигурировав следующие аргументы запуска JVM:

    -Dcom.sun.management.jmxremote=true -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.rmi.port=4444 -Djava.rmi.server.hostname=127.0.0.1
    

Обратите внимание, что это присоединяет другой динамический порт RMIи устанавливает имя хоста для сервера RMI.

  • Переадресация локальных портов на эти порты модуля:

    kubectl --namespace=<namespace> port-forward <pod-name> 4444:4444 1099:1099
    
  • Запуск локально инструмента, который может подключаться к JVM в модулечерез JMX (jconsole, jvisualvm, jmc ... в зависимости от того, что вам доступно).URL JMX будет выглядеть следующим образом:

    service:jmx:rmi://127.0.0.1:4444/jndi/rmi://127.0.0.1:1099/jmxrmi
    

Вопрос № 3: «Есть ли профилировщик, который я могу подключить к jvm, работающему в модулях?»A: Краткий ответ - «да».Я использовал JProfiler для удаленного профилирования приложений Java, работающих на k8s, через переадресацию портов.(Я не связан с JProfiler и не рекламирую его - это был просто инструмент, для которого у команды, которой я помогал, была лицензия)

0 голосов
/ 24 декабря 2018

Вы можете использовать Vertical Pod Autoscaler для автоматического обновления лимитов ЦП / памяти в соответствии с потреблением вашего контейнера.

Чтобы получить метрики JVM, я бы порекомендовал установить на сервер какой-нибудь плагин prometheus и очистить метрики,Затем вы можете увидеть, сколько объектов является живой, и информацию о поколениях, чтобы лучше понять причину использования памяти и как ее контролировать.

Вы можете подключить профилировщик, открыв соответствующие порты, используя kubectl proxy

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...