通过SSH和JMX远程监控Java服务

通过SSH和JMX远程监控Java服务

June 28, 2018

在日常工作中,可以使用一些监控数据的图形展示工具(比如Grafana等)来查看服务器上面JVM的使用情况,比如内存或者CPU的占用情况。但是,在需要解决实际问题的时候,比如CPU或者内存占用过高,还是需要连接到远程的服务器,查看JVM的具体运行情况来分析问题产生的原因。

通常情况下,我们是通过开启远程服务器上的JMX,使用JVisualVM或JConsole客户端,远程连接到服务器上。然而,在实际的生产环境中,Java应用服务器并没有直接暴露在公网,必须通过跳板机来连接。

网上查了一些资料,多数比较麻烦,有些还需要借助第三方工具。后来找到一个简便的方法,在使用JVisualVM或JConsole客户端的时候,通过指定socks代理的方式来连接远程服务器。下面是具体的步骤。

Java应用开启JMX

在应用启动命令里面添加下面的参数。指定JMX端口为18888

-Dcom.sun.management.jmxremote.port=18888
-Dcom.sun.management.jmxremote.rmi.port=18888
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

指定本地socks代理的端口和跳板机

在命令行中执行下面的命令开启端口转发

ssh -N -D 10099 my-bastion

注意:

  • 上述例子中的 my-bastion 是跳板机别名,在 ~/.ssh/config中配置。
  • 10099 是绑定的本地端口号
  • ssh命令帮助文档中对两个参数的解释:
  -N    Do not execute a remote command.  This is useful for just forwarding ports.

  -D [bind_address:]port
        Specifies a local “dynamic” application-level port forwarding.

用工具连接远程jvm

JConsole客户端

如果使用jconsole客户端连接。可以直接指定需要连接的服务

jconsole -J-DsocksProxyHost=localhost -J-DsocksProxyPort=10099 service:jmx:rmi:///jndi/rmi://10.10.3.11:18888/jmxrmi

JVisualVM客户端

如果使用jvisualvm客户端连接,先启动指定代理服务器的参数来启动jvisualvm

jvisualvm -J-DsocksProxyHost=localhost -J-DsocksProxyPort=10099

然后在jvm里面先添加remote host,再添加类似下面的JMX连接

service:jmx:rmi:///jndi/rmi://10.10.3.11:18888/jmxrmi

双击左边添加好的JMX连接,就可以连上服务器并监控JVM的实际状况了

最后更新于