美文网首页
Java远程监控组件JMX踩坑记录

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

作者: 魂狩 | 来源:发表于2022-06-24 16:40 被阅读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即可。

    相关文章

      网友评论

          本文标题:Java远程监控组件JMX踩坑记录

          本文链接:https://www.haomeiwen.com/subject/kgtbvrtx.html