【问题标题】:VisualVM over Putty SSH-tunnelVisualVM over Putty SSH 隧道
【发布时间】:2012-03-08 00:24:37
【问题描述】:

我正在尝试分析远程 Java 应用程序,实际上它是一个游戏服务器。它在我的本地机器上正常工作(windows XP x64 和 JDK1.7.0_02 x64),但在生产服务器上表现非常奇怪(CentOS 和 JDK1.7.0_03 i586)。

我做了很多搜索,发现我应该使用 VisualVM 来完成这项任务。所以 VisualVM 在本地机器上运行良好,但在本地机器上没有挂起,我需要在生产环境中使用真实有效负载进行分析。我用参数在远程机器上启动了 jstatd

jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.logCalls=false &

使用策略文件

grant codebase "file:/usr/java/jdk1.7.0_02/lib/tools.jar" {
    permission java.security.AllPermission;
};

然后我像这样启动了我的 java 应用程序

java -server -Dcom.sun.management.jmxremote\
 -Dcom.sun.management.jmxremote.port=4000\
 -Dcom.sun.management.jmxremote.ssl=false\
 -Dcom.sun.management.jmxremote.authenticate=false\
 -jar /home/pinballSocketServer/pinballSocketServer.jar

应用程序和 jstatd 都以 root 权限启动。

VisualVM 无​​法连接到远程主机。但是在远程主机上,我看到以下日志,而 VisualVM 正在运行并添加了远程主机:

Feb 16, 2012 7:11:52 PM sun.rmi.server.UnicastServerRef logCall
FINER: RMI TCP Connection(3)-217.16.27.195: [217.16.27.195: sun.rmi.registry.RegistryImpl[0:0:0, 0]: java.rmi.Remote lookup(java.lang.String)]
Feb 16, 2012 7:11:56 PM sun.rmi.server.UnicastServerRef logCall
FINER: RMI TCP Connection(3)-217.16.27.195: [217.16.27.195: sun.rmi.registry.RegistryImpl[0:0:0, 0]: java.rmi.Remote lookup(java.lang.String)]
Feb 16, 2012 7:12:00 PM sun.rmi.server.UnicastServerRef logCall
FINER: RMI TCP Connection(3)-217.16.27.195: [217.16.27.195: sun.rmi.registry.RegistryImpl[0:0:0, 0]: java.rmi.Remote lookup(java.lang.String)]
Feb 16, 2012 7:12:04 PM sun.rmi.server.UnicastServerRef logCall
FINER: RMI TCP Connection(3)-217.16.27.195: [217.16.27.195: sun.rmi.registry.RegistryImpl[0:0:0, 0]: java.rmi.Remote lookup(java.lang.String)]

进一步谷歌搜索后,我发现我需要使用 ssh 隧道。我通过以下方式配置腻子

http://www.advancedigital.ru/show/putty_config.jpg

和 VisualVM 一样

http://www.advancedigital.ru/show/visualvm_config.jpg

VisualVM 上面的 Adter munipulations 连接到远程主机,但我只能看到线程摘要图表并且分析器处于非活动状态。

我已经看到一些建议,两台机器上的 jvm 应该相似并且具有相同的平台(x86 或 x64),但我已经尝试从另一台机器(带有 JDK1.7.0_03 x86 的 windows 7 x86)进行分析,并且有相同的结果。

我也试过这个,但再次得到相同的结果。 VisualVM over ssh

我怎样才能让这个分析工作?

【问题讨论】:

  • 2 年后,但我也添加了我的调音方式。

标签: jmx socks visualvm ssh-tunnel jstat


【解决方案1】:

即使已经回答了这个问题,我还是设法做到了,所以我将添加我的方法:

我使用了以下来源:

https://bowerstudios.com/node/731

我在 Windows 中使用具有 ssh 命令的 git bash 执行此操作。您也可以使用 cygwin 或 pure minggw。

1) 在命令提示符下运行 ssh tunnel 命令(我在 git bash/MINGGW32 中执行此操作)。

ssh -D 9010 -p 22 root@IP -v

2) 使用 JMX 选项在服务器上运行您的应用程序(单行)

 java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9010 
-Dcom.sun.management.jmxremote.local.only=false 
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false -jar application.jar

3)通过socks代理运行visualVM进行连接(单线)

visualvm -J-Dnetbeans.system_socks_proxy=localhost:9010 
-J-Djava.net.useSystemProxies=true

4) 实际上在visualVM中添加你的JMX远程连接

也可用:http://maythesource.com/2013/12/04/connecting-to-jmx-from-visualvm-using-ssh-tunnel/(将随着时间的推移更新更多信息)。

【讨论】:

    【解决方案2】:

    请注意,如果服务器安装了 X11 库,您可以远程运行 JVisualVM,只需让 Putty 将 X11 连接转发到在本地计算机上运行的 X11 服务器。

    如果您没有可用的 X11 服务器,Xming - http://www.straightrunning.com/XmingNotes/ - 可以正常工作。如果您的计算机是安全的,您可以在没有访问控制的情况下运行,从而更容易启动和运行。

    请注意,X11 通信非常冗长。使用“blowfish”-cypher 并要求压缩。

    【讨论】:

    • 使用 X11 就像重新发明自行车……反正我也应该试试这个。
    • X11 可以做一些 Windows 做不到的事情。
    • 半年后我尝试了这个解决方案,它就像一个魅力
    【解决方案3】:

    我将从调试 jstatd 连接开始,并将 JMX 连接留待以后使用。从你写的不清楚为什么你应该使用 ssh 隧道。您的远程主机上是否有防火墙,或者您为什么认为需要使用 ssh 隧道。 另外需要注意的是,两台机器上的 jvm 应该相似并且具有相同的平台(x86 或 x64)是不正确的。

    【讨论】:

    • 没有防火墙,端口应该是开放的,但仍然没有 ssh 隧道 VisualVM 无​​法连接到远程主机。
    猜你喜欢
    • 2017-02-12
    • 2020-01-18
    • 1970-01-01
    • 2022-01-05
    • 2017-01-02
    • 2019-03-07
    • 2016-09-29
    • 1970-01-01
    相关资源
    最近更新 更多