Java jmx/jstatd通过ssh隧道访问远程计算机

Java jmx/jstatd通过ssh隧道访问远程计算机,java,jmx,visualvm,Java,Jmx,Visualvm,我希望使用jmx或jstatd通过ssh隧道(到EC2机器)使用visualvm应用程序。我该怎么做?以下是已尝试(和失败)的内容列表: (顺便说一句:如果VisualVM不合适,如何在远程机器上发现内存泄漏?) jstatd:尝试: 我在EC2机器上设置了jstatd服务器(应用程序已经在上面运行了) 然后我设置了一个隧道,将本地端口3333映射到远程端口1099 在VisualVM中,我尝试在端口3333上使用jstatd进行连接 ... EC2上没有任何进程出现 此链接表示jstatd打开

我希望使用jmx或jstatd通过ssh隧道(到EC2机器)使用visualvm应用程序。我该怎么做?以下是已尝试(和失败)的内容列表: (顺便说一句:如果VisualVM不合适,如何在远程机器上发现内存泄漏?)

jstatd:尝试: 我在EC2机器上设置了jstatd服务器(应用程序已经在上面运行了) 然后我设置了一个隧道,将本地端口3333映射到远程端口1099 在VisualVM中,我尝试在端口3333上使用jstatd进行连接 ... EC2上没有任何进程出现

此链接表示jstatd打开了另一个端口: ... 所以我把这个端口从本地主机挖到了远程主机。 我重新启动了visual vm。。。还是没什么

当我尝试使用以下命令列出从EC2运行的进程时:

jps -l -m -v rmi://localhost
java -Dcom.sun.management.jmxremote.port=3333 \
     -Dcom.sun.management.jmxremote.ssl=false \
     -Dcom.sun.management.jmxremote.authenticate=false\
        -cp :post/* <appName>
。。。我有一个进程列表

当我在我的家用电脑上用

jps -l -m -v rmi://localhost:3333
。。。。我一个也没有!那么,rmi端口是否没有通过jstatd端口(3333)进行隧道传输

jmx尝试: 我使用以下命令在远程计算机上启动了应用程序:

jps -l -m -v rmi://localhost
java -Dcom.sun.management.jmxremote.port=3333 \
     -Dcom.sun.management.jmxremote.ssl=false \
     -Dcom.sun.management.jmxremote.authenticate=false\
        -cp :post/* <appName>
如果我需要设置到remove RMI服务器的链接,我不知道该怎么做

JMXMP尝试: 这是有希望的,但有些事情并不完全正确:

首先,我将jmx_远程jar添加到类路径中,并使用与上面显示的jmx案例中相同的命令在远程机器上启动应用程序。我在家里找到了这个罐子

我设置了一个从本地端口3333到远程端口3333的ssh隧道。然后,我用calsspath中相同的jmx_远程文件启动了visualvm

visualvm -cp:a ~/jmx/jmxremote_optional.jar
然后,我尝试通过以下方式将visualvm连接到远程服务器:

service:jmx:jmxmp://localhost:3333
现在,VisualVM似乎试图无限期地连接。它显示“添加服务:jmx:jmxp://localhost:3333“在状态栏中。。。然后继续这样做,直到我关闭远程端的应用程序,这时它抛出一个弹出窗口,说它无法与服务器连接

关于使用袜子: 我尝试同时使用JMX和jstatd都失败了

我不确定SOCKS代理是否正常工作,因此以下是我尝试连接的方式:

ssh -i ~/.ssh/starter.pem -v -D 9696 user@host
为了完整起见,我在另一端启动命令时使用了:

    java -Dcom.sun.management.jmxremote\
 -Dcom.sun.management.jmxremote.ssl=false\
 -Dcom.sun.management.jmxremote.authenticate=false\
 -Dcom.sun.management.jmxremote.port=3333 <app>
我不知道这是否与袜子频道有关。我以前曾通过隧道将单个端口连接到远程机器,因此我无法想象这是隧道的配置问题。我两边都在运行ubuntu linux


感谢阅读:)

JMX/RMI很难直接隧道,因为如果RMI。基本上,服务器创建了一个RMI存根定义,该定义提供了连接到它来自的服务器的方向,但是当您调谐时,存根从服务器上下来,但是它们的方向都是错误的,并且它们无法从这里到达


解决这一问题的最简单方法是断开RMI连接器并使用。底层协议是纯套接字协议,因此它非常适合隧道传输。

使用SSH隧道和SOCKS代理。有关更多详细信息,请参阅。

我两分钟前刚刚做了这个

  • 端口8686上带有jmx的远程服务器-此端口已锁定
  • 远程框上的sshd_配置应具有“AllowTcpForwarding yes”或注释掉
  • 打开putty ssh会话,端口将本地端口8686(或其他任何端口)转发到localhost:8686
  • 在VisualVm中添加指向本地转发端口的本地jmx连接
  • VisualVm自动查看jvm并开始监视

    • 以下是对我有效的步骤:

    • 以这种方式在远程主机中启动(在ejstatd文件夹中):
      mvn exec:java-Dexec.args=“-pr 2000-ph 2001-pv 2002”
      (用于“jstatd”类型的连接)
    • 使用以下附加Java参数启动Java应用程序:
      -Dcom.sun.management.jmxremote-Dcom.sun.management.jmxremote.ssl=false-Dcom.sun.management.jmxremote.port=2003-Dcom.sun.management.jmxremote.rmi.port=2003
      (用于“JMX”类型的连接)
    • 打开到远程主机的SSH会话,通过隧道传输这4个端口(包括从2000年到2003年)。例如,对于OpenSSH客户端,必须添加以下参数:
      -L2000:localhost:2000-L2001:localhost:2001-L2002:localhost:2002-L2003:localhost:2003
    • 启动JVisualVM
    • 右键单击“本地”>“添加jstatd连接…”>“添加自定义”并在“端口”选项中输入“
      2000
    • 右键单击“本地”>“添加JMX连接…”并在“连接”输入中输入“
      localhost:2003
      ”,然后选中“不需要SSL连接”
    • 您的Java进程将出现两次:一个来自“jstatd”连接类型,另一个来自“JMX”连接类型

    • 免责声明:我是开源工具的作者。

      所以这是一个带有非标准连接的jmx。。。值得一试。我猜visual vim在找到服务器时不会有问题。那没用。。。我尝试的细节已经添加到问题中。我只是在问题部分添加了更多细节。我还制作了一个链接,用于帮助设置连接和测试的VisualVm。这似乎是一个很好的解释:这对我也不起作用。关于我尝试失败的详细信息已添加到有关使用SOCKS的部分下的问题中。您没有提到在设置SOCKS代理后在VisualVM中做了什么以及发生了什么。我放置了一个指向我用于VisualVM安装的文档的链接,并在帖子中添加了更多信息,主要是关于我在VisualVM上看到的情况。此方法为我工作,但仅适用于JDK1.7。JDK 1.6失败了,但没有特别帮助告诉我原因。仅供参考,我决定使用XFCE和tightvnc并在远程机器上运行visualvm。我直接在服务器上打开端口以测试ejstatd。我可以到达端口,但与JMX的连接不起作用。