如何在Docker中监控java应用程序的内存使用情况
我在Docker容器中的tomcat上运行java web应用程序。
有什么办法来监视Java应用程序的内存使用情况吗? 我尝试使用jconsole
与泊坞窗的进程ID,但它告诉我Invalidate process id
我也在tomcat中启用JMX,但不知道如何绑定到它。 我可以从我的本地使用visualvm
绑定主机,但无法find绑定到主机内的docker的方式。
有没有什么好的方法来实现这一目标?
谢谢
要连接到运行在使用boot2docker
中的boot2docker
容器中运行的java进程,可以尝试以下操作:
使用以下选项启动您的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>
运行映像。
然后使用<boot2docker_ip>:<port>
在<boot2docker_ip>:<port>
“添加JMX连接”。
没有boot2docker
应该没有太大的区别。
要监视它的使用情况,你需要得到它的真实进程ID。 如果你直接在容器中运行tomcat,那么它应该是:
DOCKER_ROOT_PROC=`(docker inspect -f "{{ .State.Pid }}" my_container)`
如果您正在使用Phusion的baseimage之类的东西,那么您的java进程将是该进程的一个subprocess。 要查看层次使用:
pstree $DOCKER_ROOT_PROC
一旦你有了,你可以使用写脚本
ps -o pid,cmd --no-headers --ppid $DOCKER_ROOT_PROC
在你的脚本中recursion地find你想要监视的java进程(当然有一些正则expression式过滤)。 最后你可以用这个来获得你的java应用程序的内存使用情况(千字节):
ps -o vsz -p $JAVAPROCESS
我不知道这是否可以用于jconsole,但它是一种监视内存使用情况的方法。
要监视docker集装箱,我推荐Google的cAdvisor
项目 。 这样你有一个通用的解决scheme来监视docker集装箱。 只要运行你的应用程序,无论是在docker容器中,并检查CPU和内存使用情况。 这里有一个http API和一个web ui。
我试了皮埃尔的回答 ( 也在这里回答 ),但没办法。
最后我可以使用SSH隧道进行连接。
上面提到的cAdvisor将无助于监视容器内运行的Tomcat。 您可能想看看SPM客户端泊坞窗容器,这完全是! 它具有监视Docker中运行的多个不同应用程序的代理 – Elasticsearch,Solr,Tomcat,MySQL等等: https : //github.com/sematext/docker-spm-client
对于Docker中应用程序的内存使用情况监视,您还可以在Docker容器中启动ejstatd (调用mvn -Djava.rmi.server.hostname=$HOST_HOSTNAME exec:java -Dexec.args="-pr 2222 -ph 2223 -pv 2224" &
从ejstatd文件夹启动你的主容器进程之前),使用docker run -e HOST_HOSTNAME=$HOSTNAME -p 2222:2222 -p 2223:2223 -p 2224:2224 myimage
3个端口暴露给Docker主机docker run -e HOST_HOSTNAME=$HOSTNAME -p 2222:2222 -p 2223:2223 -p 2224:2224 myimage
。
然后,您将能够使用JVisualVM连接到这个特殊的jstatd守护进程,例如添加一个指定您的Docker主机名为“主机名”的远程主机,并通过设置添加一个“Custom jstatd Connections”(在“高级设置”中) “2222”到“Port”。
免责声明:我是这个开源工具的作者。