Java远程监控组件JMX踩坑记录

2022-06-24  本文已影响0人  魂狩

近日,由于有个java服务CPU占用异常高,所以需要远程监控看看问题。最简单的解决方案就是使用自带的jconsole,于是开始踩坑。

jconsole使用的是java的jmx(Java manage extension)组件,本地可以直接attach进程,但是默认无法远程连接。查阅资料后发现,启用jmx远程功能(remote jmx)需要添加jvm参数,大致是下面这样(idea里面配置参数需要删掉末尾\

-Dcom.sun.management.jmxremote.ssl=false \
 -Dcom.sun.management.jmxremote.authenticate=false \
 -Dcom.sun.management.jmxremote.port=5000 \
 -Dcom.sun.management.jmxremote.rmi.port=5000 \
 -Dcom.sun.management.jmxremote.host=0.0.0.0 \
 -Djava.rmi.server.hostname=0.0.0.0

本地先测试,IDEA添加参数,运行,打开jconsole连接127.0.0.1:5000,一切顺利,准备发版。
由于我们使用docker实现完整的CI流程,所以jvm参数需要放在环境变量BPE_APPEND_JAVA_TOOL_OPTIONS里面。配置好后发版,远程连接,连接失败。

这是为什么呢?我首先开始怀疑是不是网络没连接上,但是鉴于有提示ssl加密连接失败,应该是连接上了的。开了大鲨鱼(wireshark)之后确认网络连接成功,是其他原因导致的连接失败。
这是为什么呢?继续查资料,发现有的人hostname会配置成其他的,猜测是hostname的问题。由于线上服务器用了k8s,ip是变化的,所以用自己电脑尝试。本地把hostname改成本地ip,然后用同事电脑连接,连接成功,问题解决。

开启jmx远程功能只需要下面几行代码即可:

-Dcom.sun.management.jmxremote.ssl=false \
 -Dcom.sun.management.jmxremote.authenticate=false \
 -Dcom.sun.management.jmxremote.port=5000 \
 -Dcom.sun.management.jmxremote.rmi.port=5000 \
 -Djava.rmi.server.hostname=服务器ip或域名

动态ip可以使用本地域名,比如hello.local,需要连接的时候修改本地hosts即可。

上一篇下一篇

猜你喜欢

热点阅读