调试 VisualVM 远程连接

Posted

技术标签:

【中文标题】调试 VisualVM 远程连接【英文标题】:Debugging VisualVM remote connection 【发布时间】:2012-05-11 00:28:07 【问题描述】:

我在亚马逊云中的 Linux 服务器上运行 Tomcat 6。我正在尝试通过我办公室的 Mac 上的 VisualVM 连接到它。我已允许打开我的桌面和服务器之间的所有 TCP 端口,但我无法让 VisualVM 执行任何操作。

在 linux 机器上,我已经启动了 Tomcat:

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9191
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false

在我的 Mac 上,我启动 VisualVM 并选择 File -> New JMX Connection...

我在框中输入 amazonhostname.com:9191。它显示“正在添加 amazonhostname.com:9191...”,并在此处停留了几分钟,然后超时。

在我的 Mac 上,我可以“telnet amazonhostname.com 9191”就好了,我尝试了其他一些随机端口,它们都可以正常工作。我很确信这不是防火墙问题,除非我需要打开 UDP 或 ICMP 或类似的东西。 (真的吗??)

服务器上的 catalina.log 或我的 Mac 上的系统控制台中没有任何与 jmx 相关的内容。服务器上的 netstat 显示 9191 和所有接口上打开的其他一些端口。

远程服务器上没有 jstatd。这是 JMX 的先决条件吗? (我对 Java 完全陌生,我什至不确定这些东西是什么意思,但我在某处的博客文章中看到了它。我现在正抓着稻草。)

【问题讨论】:

您确定 iptables 没有阻止您的 linux 机器上的连接吗?编辑:我看到你可以远程登录 - 好吧,从头开始。 您需要查看的另一件事是 RMI 主机名 - 看看:***.com/questions/9985293/… 不需要Jstatd。正如 Greg 建议的那样,尝试将 -Djava.rmi.server.hostname=the.public.ip 添加到 Tomcat JVM 参数中。 感谢 Tomas 和 Greg - rmi.server.hostname 成功了。算我一个!如果你们中的某个人想重写您的评论作为答案,我会接受。 @GregKopff 你应该写一个答案 【参考方案1】:

在虚拟机启动前设置主机名属性:

java -Dcom.sun.management.jmxremote \
     -Dcom.sun.management.jmxremote.port=9191 \
     -Dcom.sun.management.jmxremote.authenticate=false \
     -Dcom.sun.management.jmxremote.ssl=false \
     -Djava.rmi.server.hostname=the.public.ip \
     -jar program.jar

将相关规则添加到您的安全组。

【讨论】:

很遗憾,无法像 Elastic Beanstalk 那样进行自动缩放。 @mwoodman:我没用过 EB,但你知道为什么这不适用(让后续的 SO 搜索者知道)吗? 我认为 -Dcom.sun.management.remote.ssl=false 应该是 -Dcom.sun.management.jmxremote.ssl=false @TomGwozdz:我已经很久没有看到这个了,我无法再访问那个代码库来仔细检查,但看起来你是对的 - 我已经更新了答案。 @greg-kopff:EB 实例根据负载来来去去。没有一种简单的方法可以通过每个实例的自定义来控制预部署环境。您将获得一个基于预定图像的实例,并将您的应用程序部署到 Tomcat 中。其他一切都相当不透明。【参考方案2】:

在 RHEL7 环境中对我有用的是使用文档中提供的示例在 Tomcat 上实现 JmxRemoteLifecycleListener。我还在防火墙上开放了 10001 和 10002 端口。 JMX Remote Lifecycle Listener

【讨论】:

以上是关于调试 VisualVM 远程连接的主要内容,如果未能解决你的问题,请参考以下文章

VisualVM 的问题 - 连接到远程主机时

仍然无法通过 VisualVM 远程连接 Tomcat 6

VisualVM通过JMX远程连接JVM

visualVM远程监控JVM

使用 visualvm 和 JMX 进行远程监控

Java Mission Control - 访问被拒绝连接到远程