java - jmx/jstatd 通过 ssh 隧道访问远程机器

标签 java jmx visualvm

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

jstatd:尝试:

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

这个链接说 jstatd 打开了另一个端口: http://rukuro-blog.heroku.com/2011/06/30/monitoring-remote-java-applications-with-visualvm ...所以我将该端口从本地主机隧道传输到远程主机。 我重新启动了 visual vm ... 仍然没有

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

jps -l -m -v rmi://localhost

...我得到了一个进程列表

当我在家用机器上列出它时使用

jps -l -m -v rmi://localhost:3333

....我没有!那么,rmi 端口是否未与 jstatd 端口 (3333) 建立隧道...?

jmx 尝试:

我使用以下命令在远程机器上启动了应用程序:

java -Dcom.sun.management.jmxremote.port=3333 \
     -Dcom.sun.management.jmxremote.ssl=false \
     -Dcom.sun.management.jmxremote.authenticate=false\
        -cp :post/* <appName>

...该应用程序运行正常,所以我将本地端口 3333 隧道连接到远程 3333

然后我尝试从可视化虚拟机界面设置一个指向 localhost:3333 的 jmx 链接: ...它弹出一个错误说:

cannot connect to localhost:3333 using service:jmx:rmi:///jndi/rmi://localhost:3333/jmxrmi

如果我需要设置一个指向删除 RMI 服务器的链接,我不知道该怎么做。

JMXMP 尝试:

这很有希望,但有些地方不太对:

首先,我将 jmx_remote jar 添加到类路径,并使用与上面显示的 JMX 案例中相同的命令在远程计算机上启动应用程序。我在 oracle download link 找到了 jar

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

visualvm -cp:a ~/jmx/jmxremote_optional.jar

然后我尝试将 visualvm 连接到远程服务器:

service:jmx:jmxmp://localhost:3333

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

关于使用 SOCKS:

我尝试同时使用 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>

在本地端,我按照 LINK to VisualVm help page 设置了 visualvm 连接.

通过 JMX 连接,我通过在 visualvm 上右键单击主机并在提示时填写主机端口来设置机器名称和端口。此时底部的状态栏显示 visualvm 正在尝试连接到远程计算机,几分钟后它失败了。

通过 jstatd 连接,我希望远程进程能够自动显示。这没有发生......没有错误消息或任何东西。

在 socks 端,以下消息循环重复:

debug1: Connection to port 9696 forwarding to socks port 0 requested.
debug1: channel 2: new [dynamic-tcpip]
channel 3: open failed: connect failed: Connection timed out
debug1: channel 3: free: direct-tcpip: listening port 9696 for 50.16.35.69 port 3333, connect from 127.0.0.1 port 43909, nchannels 4
debug1: Connection to port 9696 forwarding to socks port 0 requested.
debug1: channel 3: new [dynamic-tcpip]
channel 2: open failed: connect failed: Connection timed out
debug1: channel 2: free: direct-tcpip: listening port 9696 for 50.16.35.69 port 1099, connect from 127.0.0.1 port 44644, nchannels 4

我想知道这是否与 socks channel 有关。我之前已经将单个端口隧道连接到远程机器,所以我无法想象这是隧道的配置问题。我在两边都运行 ubuntu linux。

感谢阅读:)

最佳答案

将 SSH 隧道与 SOCKS 代理结合使用。参见 this post了解更多详情。

关于java - jmx/jstatd 通过 ssh 隧道访问远程机器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12825117/

相关文章:

java - Eclipse 自动重构字符串比较

java - JMX操作可以将接口(interface)作为参数吗?

java - CPU 使用率和 CPU 利用率有什么区别?

java - VisualVM 堆转储与探查器不一致

java - VisualVM 分析正在污染结果

java - 如何在所有 Activity 中显示 Timer 的剩余时间?

java - 运行时在面板上绘制

java - 如何实现两个不同类中需要的枚举?

java - 使用 JMX 以编程方式公开调用统计信息

java - 如何将 .Net 应用程序连接到 JMX 代理?