Java jmx/jstatd通过ssh隧道访问远程计算机
我希望使用jmx或jstatd通过ssh隧道(到EC2机器)使用visualvm应用程序。我该怎么做?以下是已尝试(和失败)的内容列表: (顺便说一句:如果VisualVM不合适,如何在远程机器上发现内存泄漏?) jstatd:尝试: 我在EC2机器上设置了jstatd服务器(应用程序已经在上面运行了) 然后我设置了一个隧道,将本地端口3333映射到远程端口1099 在VisualVM中,我尝试在端口3333上使用jstatd进行连接 ... EC2上没有任何进程出现 此链接表示jstatd打开了另一个端口: ... 所以我把这个端口从本地主机挖到了远程主机。 我重新启动了visual vm。。。还是没什么 当我尝试使用以下命令列出从EC2运行的进程时: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打开
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文件夹中):
(用于“jstatd”类型的连接)mvn exec:java-Dexec.args=“-pr 2000-ph 2001-pv 2002”
- 使用以下附加Java参数启动Java应用程序:
(用于“JMX”类型的连接)-Dcom.sun.management.jmxremote-Dcom.sun.management.jmxremote.ssl=false-Dcom.sun.management.jmxremote.port=2003-Dcom.sun.management.jmxremote.rmi.port=2003
- 打开到远程主机的SSH会话,通过隧道传输这4个端口(包括从2000年到2003年)。例如,对于OpenSSH客户端,必须添加以下参数:
-L2000:localhost:2000-L2001:localhost:2001-L2002:localhost:2002-L2003:localhost:2003
- 启动JVisualVM
- 右键单击“本地”>“添加jstatd连接…”>“添加自定义”并在“端口”选项中输入“
”李>2000
- 右键单击“本地”>“添加JMX连接…”并在“连接”输入中输入“
”,然后选中“不需要SSL连接”localhost:2003
- 您的Java进程将出现两次:一个来自“jstatd”连接类型,另一个来自“JMX”连接类型
- 以下是对我有效的步骤:
免责声明:我是开源工具的作者。所以这是一个带有非标准连接的jmx。。。值得一试。我猜visual vim在找到服务器时不会有问题。那没用。。。我尝试的细节已经添加到问题中。我只是在问题部分添加了更多细节。我还制作了一个链接,用于帮助设置连接和测试的VisualVm。这似乎是一个很好的解释:这对我也不起作用。关于我尝试失败的详细信息已添加到有关使用SOCKS的部分下的问题中。您没有提到在设置SOCKS代理后在VisualVM中做了什么以及发生了什么。我放置了一个指向我用于VisualVM安装的文档的链接,并在帖子中添加了更多信息,主要是关于我在VisualVM上看到的情况。此方法为我工作,但仅适用于JDK1.7。JDK 1.6失败了,但没有特别帮助告诉我原因。仅供参考,我决定使用XFCE和tightvnc并在远程机器上运行visualvm。我直接在服务器上打开端口以测试ejstatd。我可以到达端口,但与JMX的连接不起作用。