繁体   English   中英

使用visualvm和JMX进行远程监控

[英]Remote monitoring with visualvm and JMX

我想使用 jvisualvm(或 jconsole)监视远程运行的 java(spring boot)应用程序。 在本地运行时,我可以在 jvisualvm 和 jconsole 中看到托管 bean。 远程运行时,我无法连接。 我尝试了几个不同的 java 进程(例如使用 spring xd)。 在 SO 和 Google 上寻找答案并没有帮助。

这些是我的 JAVA_OPTS(在远程主机上):

$ echo $JAVA_OPTS
-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.59.99

然后我简单的启动程序如下(这个是针对spring xd的,但是我用其他java程序也遇到了同样的问题)。

$ bin/xd/xd-singlenode

服务器进程似乎选择了以下选项:

$ ps -ef | grep single
vagrant  22938 19917 99 06:38 pts/2    00:00:03 /usr/lib/jvm/java-8- oracle/jre/bin/java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=192.168.59.99 -Dspring.application.name=admin -Dlogging.config=file:/home/vagrant/spring-xd-1.1.0.RELEASE/xd/config///xd-singlenode-logger.properties -Dxd.home=/home/vagrant/spring-xd-1.1.0.RELEASE/xd -Dspring.config.location=file:/home/vagrant/spring-xd-1.1.0.RELEASE/xd/config// -Dxd.config.home=file:/home/vagrant/spring-xd-1.1.0.RELEASE/xd/config// -Dspring.config.name=servers,application -Dxd.module.config.location=file:/home/vagrant/spring-xd-1.1.0.RELEASE/xd/config//modules/ -Dxd.module.config.name=modules -classpath (...)

远程主机(ubuntu linux vm)上的java版本是:

$ java -version
java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)

本地机器(Mac OS)上的java版本略有不同:

$ java -version    
java version "1.8.0_40"
Java(TM) SE Runtime Environment (build 1.8.0_40-b25)
Java HotSpot(TM) 64-Bit Server VM (build 25.40-b25, mixed mode)

在 jvisualvm 中,我按如下方式添加远程连接(尝试使用 ssl 连接和不使用 ssl 连接):

在此处输入图片说明

这是 jvisualvm 给我的错误消息:

jvisualvm 给出的错误信息

当远程进程正在运行时,我可以使用命令telnet 192.168.59.99:9010从本地主机连接到远程主机 - 所以这似乎不是防火墙问题。

任何帮助都受到高度赞赏。

请使用以下 JVM 选项:

-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=192.168.59.99

在 Jconsole 中,使用以下内容进行连接:

service:jmx:rmi:///jndi/rmi://192.168.59.99:9010/jmxrmi

Arnab Biswas 的 anwser 在我的情况下不起作用。 经过一个小时的研究,我发现 JMX 运行在 RMI 之上,因此,JMX 使用了 2 个端口:

  • JMX 连接端口。 ( -Dcom.sun.management.jmxremote.port )
  • (臭名昭著的)漫游 RMI 数据端口。 ( -Dcom.sun.management.jmxremote.rmi.port )

RMI 数据端口将打开一个从1099开始的随机端口。 通过将 RMI 注册表和 RMI 服务器使用的端口设置为相同的端口,隧道将变得更加容易。

所以我需要将-Dcom.sun.management.jmxremote.rmi.port=9010添加到 JVM 选项

我需要使用以下 JVM 选项:

-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.rmi.port=9010 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=192.168.59.99

阅读更多:

让我详细讨论一下。 我刚刚将它连接到远程服务器。 你需要去你的jar文件所在的文件夹。 假设,您想监视X.jar文件并假设它位于usr/local/文件夹中。因此,首先cd进入该文件夹。 然后确定哪个 jdk 正在运行。 你可以通过在linux中执行命令which java找到它。 在远程服务器的命令行中(一般我们使用PuTTy cmd)。 在 PuTTy cmd 中写入:

java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.rmi.port=9010 -Dcom.sun.management.jmxremote.local.only=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=192.168.10.0 -jar X.jar

现在让我详细解释一下。 这里需要定义rmi端口,因为jmx使用rmi 如果我们不定义rmi端口,它会自动分配一个随机端口。 那么我们的连接就不会成功。 我们不会使用身份验证和 ssl,因为这会造成困难。 如果你愿意,你可以自己尝试。 在主机名中,您必须指定作为 IP 地址的远程主机名。 现在使用位于本地计算机中的visualvm 一般可以在这个文件夹中找到:

C://Program Files/Java/jdk1.8.0_201/bin 

如果没有,则下载它并将其粘贴到目录中。 从本地电脑运行visualvm。 您将看到一些选项,如本地、远程。 在“远程”选项中选择“添加远程主机”。 添加您的主机名。 就我而言,它是192.168.10.0 然后右键单击鼠标并选择“添加 jmx 连接”。 将打开一个窗口并插入您的端口号。 就我而言,它是9010 您可以指定任何端口号。 选择“不需要 ssl 连接”并且不要选择安全凭证。 因为我们在属性中添加了身份验证为假。 现在连接,您的连接将顺利进行。 还有一个建议。 您可以使用“jstatd connection”进行连接。但它不起作用。不显示任何输出。可能是因为java 8问题左右。要监视内存详细信息,您需要更新版本的“visualvm.exe”。您可以下载它。您可以使用身份验证和 SSL 进行连接。此链接中讨论了使用 Authentication=true 的详细步骤: Connect to remote JMX Agent with authentication

此链接中讨论了使用 authentication=true 和 SSL = true 的详细步骤: JConsole SSL/TLS with Password Authentication

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM