Memory 如何在Docker中监控java应用程序内存使用情况

Memory 如何在Docker中监控java应用程序内存使用情况,memory,jvm,docker,monitoring,cadvisor,Memory,Jvm,Docker,Monitoring,Cadvisor,我在Docker容器中的tomcat上运行java web应用程序 有没有办法监视java应用程序的内存使用情况?我尝试将jconsole与docker的进程id一起使用,但它告诉我Invalidate进程id 我也在tomcat中启用了JMX,但不知道如何绑定到它。我可以使用本地的visualvm绑定主机,但找不到绑定主机内部docker的方法 有什么好办法可以做到这一点吗 感谢要监视它的使用情况,您需要获取它的真实进程ID。如果您直接在容器中运行tomcat,那么它应该是: DOCKER_R

我在Docker容器中的tomcat上运行java web应用程序

有没有办法监视java应用程序的内存使用情况?我尝试将
jconsole
与docker的进程id一起使用,但它告诉我
Invalidate进程id

我也在tomcat中启用了JMX,但不知道如何绑定到它。我可以使用本地的
visualvm
绑定主机,但找不到绑定主机内部docker的方法

有什么好办法可以做到这一点吗


感谢

要监视它的使用情况,您需要获取它的真实进程ID。如果您直接在容器中运行tomcat,那么它应该是:

DOCKER_ROOT_PROC=`(docker inspect -f "{{ .State.Pid }}" my_container)`
如果您使用的是Phusion的baseimage之类的东西,那么您的java进程将是该进程的子进程。要查看层次结构,请使用:

pstree $DOCKER_ROOT_PROC
一旦你有了它,你就可以用

ps -o pid,cmd --no-headers --ppid $DOCKER_ROOT_PROC
在脚本中递归地查找要监视的java进程(当然,使用一些正则表达式过滤)。最后,您可以使用它获取java应用程序的内存使用量(以KB为单位):

ps -o vsz -p $JAVAPROCESS

我不知道这是否可以与jconsole一起使用,但这是一种监视内存使用情况的方法。

我建议监视docker容器。这样,您就有了监视docker容器的通用解决方案。只需在docker容器中运行应用程序,并检查cpu和内存使用情况。这里有一个http API和一个web ui。

要连接运行在docker容器中的java进程,使用
visualvm
boot2docker
中运行,您可以尝试以下操作:

使用以下选项启动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>
java-Dcom.sun.management.jmxremote.port=\
-Dcom.sun.management.jmxremote.authenticate=false\
-Dcom.sun.management.jmxremote.ssl=false\
-Dcom.sun.management.jmxremote.rmi.port=\
-Djava.rmi.server.hostname=\
您需要使用
--expose-p:
运行映像

然后使用
visualvm
中“添加JMX连接”

如果没有
boot2docker

它应该不会有太大的不同。我尝试了()但没有办法


最后,我可以使用上面提到的.

cAdvisor进行连接,这无助于监视容器内运行的Tomcat。您可能想看看SPM客户端docker容器,它正是这样做的!它有用于监视Docker中运行的许多不同应用程序的代理—Elasticsearch、Solr、Tomcat、MySQL等等:

要监视Docker中的应用程序的内存使用情况,您还可以在Docker容器中启动一个(调用
mvn-Djava.rmi.server.hostname=$HOST\u hostname exec:java-Dexec.args)=“-pr2222-ph2223-pv2224”&
在启动主容器进程之前从ejstatd文件夹中),使用
Docker run-e host_HOSTNAME=$HOSTNAME-p 2222:2222-p 2223:2223-p 2224:2224 myimage将这3个端口公开给Docker主机

然后,您将能够使用JVisualVM连接到这个特殊的jstatd守护程序,例如,添加一个“远程主机”,将Docker主机名指定为“主机名”,并通过将“2222”设置为“端口”添加一个“自定义jstatd连接”(在“高级设置”中)


免责声明:我是这个开源工具的作者。

要获得总体内存使用情况,你应该能够监视docker容器进程,对吗?不是用jconsole,因为那不是Java进程,而是用Linux工具,如
top
ps
smem
等。或者你是在谈论内存调试,你想要什么更详细的信息?@qkrijger是的,我想调试内存泄漏问题。我知道我可以在本地运行应用程序来完成这项工作。我只想知道是否有远程方法来实现这一点。谢谢,在主机上运行
jconsole
,然后在Docker中使用并公开jmx远程端口如何?确保您没有此选项“-Dcom.sun.management.jmxremote.local.only=false“因为这就是它对我不起作用的原因。你的回答帮助我找到了答案。谢谢!