Как отслеживать использование памяти Java-приложением в Docker

Я запускаю веб-приложение java на tomcat в контейнере Docker.

Есть ли способ контролировать использование памяти java-приложением? Я пытаюсь использовать jconsole с идентификатором процесса докера, но он сообщает мне Invalidate process id

Я также включаю JMX в tomcat, но не знаю, как к нему привязаться. Я могу использовать visualvm со своего локального компьютера для привязки хост-машины, но не могу найти способ привязать к докеру внутри хоста.

Есть ли хороший способ добиться этого?

Спасибо


person Browny Lin    schedule 16.04.2014    source источник
comment
Чтобы получить общее использование памяти, вы должны иметь возможность отслеживать процесс контейнера докеров, верно? Не с jconsole, поскольку это не процесс Java, а с такими инструментами Linux, как top, ps, smem и т. Д. Или вы говорите об отладке памяти и хотите получить более подробную информацию?   -  person qkrijger    schedule 16.04.2014
comment
@qkrijger да, я хочу устранить проблему с утечкой памяти. Я знаю, что для этого могу запустить приложение локально. Просто хочу знать, есть ли какой-нибудь удаленный способ добиться этого. Спасибо   -  person Browny Lin    schedule 16.04.2014
comment
хорошо, а как насчет запуска jconsole на вашем хосте и использования stackoverflow.com/questions/856881/ и в Docker выставить удаленный порт jmx?   -  person qkrijger    schedule 16.04.2014


Ответы (6)


Чтобы подключиться к java-процессу, запущенному в контейнере докеров, запущенном в boot2docker с visualvm, вы можете попробовать следующее:

Запустите свой Java-процесс, используя следующие параметры:

java -Dcom.sun.management.jmxremote.port=<port> \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false \
-Dcom.sun.management.jmxremote.rmi.port=<port> \
-Djava.rmi.server.hostname=<boot2docker_ip> \
<Main>

Вам нужно запустить изображение с --expose <port> -p <port>:<port>.

Затем «Добавить соединение JMX» в visualvm с помощью <boot2docker_ip>:<port>.

Без boot2docker он не должен сильно отличаться.

person Pierre Mage    schedule 11.09.2015
comment
Убедитесь, что у вас нет опции -Dcom.sun.management.jmxremote.local.only = false, так как это была причина, по которой он не работал у меня. Ваш ответ помог мне разобраться. Спасибо! - person Joao Baltazar; 17.11.2015

Чтобы отслеживать его использование, вам нужно получить его настоящий идентификатор процесса. Если вы запускаете tomcat прямо в контейнере, то это должно быть:

DOCKER_ROOT_PROC=`(docker inspect -f "{{ .State.Pid }}" my_container)`

Если вы используете что-то вроде baseimage от Phusion, то ваш java-процесс будет его потомком. Чтобы увидеть иерархию, используйте:

pstree $DOCKER_ROOT_PROC

Как только у вас есть это, вы можете написать свой скрипт, используя

ps -o pid,cmd --no-headers --ppid $DOCKER_ROOT_PROC

В вашем скрипте рекурсивно найдите java-процесс, который вы хотите отслеживать (конечно, с некоторой фильтрацией регулярных выражений). Затем, наконец, вы можете использовать это, чтобы получить использование памяти вашим Java-приложением в килобайтах:

ps -o vsz -p $JAVAPROCESS

Я не знаю, можно ли это использовать с jconsole, но это способ мониторинга использования памяти.

person coladict    schedule 17.07.2014

Для мониторинга контейнеров докеров я рекомендую cAdvisor проект Google. Таким образом, у вас есть общее решение для мониторинга контейнеров докеров. Просто запустите свое приложение, что бы оно ни было, в контейнере докера и проверьте такие вещи, как использование процессора и памяти. Здесь у вас есть http API, а также веб-интерфейс.

person xh3b4sd    schedule 12.10.2014

Я попробовал ответ Пьера (также ответил здесь) но никак.

В конце я мог подключиться с помощью SSH-туннель.

person lucasvc    schedule 02.12.2015

Упомянутый выше cAdvisor не поможет с мониторингом Tomcat, запущенного внутри контейнера. Вы можете взглянуть на докер-контейнер SPM Client, который делает именно это! В нем есть агенты для мониторинга ряда различных приложений, работающих в Docker - Elasticsearch, Solr, Tomcat, MySQL и так далее: https://github.com/sematext/docker-spm-client

person user3148164    schedule 05.08.2016

Для мониторинга использования памяти вашим приложением в Docker вы также можете запустить ejstatd внутри Docker. container (вызывая mvn -Djava.rmi.server.hostname=$HOST_HOSTNAME exec:java -Dexec.args="-pr 2222 -ph 2223 -pv 2224" & из папки ejstatd перед запуском вашего основного процесса контейнера), предоставляя эти 3 порта хосту Docker с помощью docker run -e HOST_HOSTNAME=$HOSTNAME -p 2222:2222 -p 2223:2223 -p 2224:2224 myimage.

Затем вы сможете подключиться к этому специальному демону jstatd с помощью JVisualVM, например, добавив «Удаленный хост», указав имя хоста Docker как «Имя хоста» и добавив «Пользовательские подключения jstatd» (в «Дополнительные настройки»), установив «2222» в «Порт».

Отказ от ответственности: я являюсь автором этого инструмента с открытым исходным кодом.

person Anthony O.    schedule 02.11.2016