我在 Docker 容器中的 tomcat 上运行 java Web 应用程序。
有没有办法监控java应用程序的内存使用情况?我尝试使用jconsole
docker 的进程 ID,但它告诉我Invalidate process id
我也在tomcat中启用了JMX,但不知道如何绑定它。我可以visualvm
从本地使用绑定主机,但找不到绑定到主机内部 docker 的方法。
有什么好的方法可以实现这一目标吗?
谢谢
我在 Docker 容器中的 tomcat 上运行 java Web 应用程序。
有没有办法监控java应用程序的内存使用情况?我尝试使用jconsole
docker 的进程 ID,但它告诉我Invalidate process id
我也在tomcat中启用了JMX,但不知道如何绑定它。我可以visualvm
从本地使用绑定主机,但找不到绑定到主机内部 docker 的方法。
有什么好的方法可以实现这一目标吗?
谢谢
要连接到在运行的 docker 容器中运行的 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>
.
然后visualvm
使用<boot2docker_ip>:<port>
.
没有它应该不会有太大的不同boot2docker
。
To monitor docker containers I recommend Google's cAdvisor
project. That way you have a general solution to monitor docker containers. Just run your app, whatever that is, in a docker container, and check things like cpu and memory usage. Here you have an http API as well as a web ui.
要监控它的使用情况,您需要获取它的真实进程 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 应用程序的内存使用量(以千字节为单位):
ps -o vsz -p $JAVAPROCESS
我不知道这是否可以与 jconsole 一起使用,但它是一种监视内存使用情况的方法。
上面提到的 cAdvisor 对监控容器内运行的 Tomcat 没有帮助。您可能想看看 SPM Client docker 容器,它就是这样做的!它具有用于监视在 Docker 中运行的许多不同应用程序的代理 - Elasticsearch、Solr、Tomcat、MySQL 等:https ://github.com/sematext/docker-spm-client
对于 Docker 中应用程序的内存使用监控,您还可以在 Docker 容器中启动一个ejstatdmvn -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
.
然后,您将能够使用 JVisualVM 连接到这个特殊的 jstatd 守护进程,例如,添加一个“远程主机”,将您的 Docker 主机名指定为“主机名”,并通过设置添加一个“自定义 jstatd 连接”(在“高级设置”中) “2222”到“端口”。
免责声明:我是这个开源工具的作者。