我在 Docker 容器中的 tomcat 上运行 java Web 应用程序。
有没有办法监控java应用程序的内存使用情况?我尝试使用jconsoledocker 的进程 ID,但它告诉我Invalidate process id
我也在tomcat中启用了JMX,但不知道如何绑定它。我可以visualvm从本地使用绑定主机,但找不到绑定到主机内部 docker 的方法。
有什么好的方法可以实现这一目标吗?
谢谢
我在 Docker 容器中的 tomcat 上运行 java Web 应用程序。
有没有办法监控java应用程序的内存使用情况?我尝试使用jconsoledocker 的进程 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”到“端口”。
免责声明:我是这个开源工具的作者。