有没有人有远程JMX JConsole工作?

时间:2008-09-29 23:54:03

标签: jmx jconsole

似乎我从来没有让这个工作过去。目前,我知道它不起作用。

但我们启动了Java流程:

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

我可以telnet到端口,并且“有东西”(也就是说,如果我不启动该过程,没有任何答案,但如果我这样做,它会这样做),但我无法让JConsole工作填充在IP和端口。

似乎它应该如此简单,但没有错误,没有噪音,没有任何东西。只是不起作用。

有人知道这方面的热门提示吗?

20 个答案:

答案 0 :(得分:122)

我有一个解决方案:

如果 Java进程在防火墙后的Linux上运行,并且您希望在本地计算机上的Windows上启动 JConsole / Java VisualVM / Java Mission Control 以进行连接到Java进程的 JMX端口

您需要通过SSH登录访问您的Linux机器。所有通信都将通过SSH连接进行隧道传输。

提示:无论是否有防火墙,此解决方案都能正常运行。

缺点:每次重新启动您的java进程时,您需要再次执行4 - 9的所有步骤。


1。您需要从这里获得Windows机器的putty-suite:

  

http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html

     

至少 putty.exe


2。在linux机器上定义一个空闲端口:

<jmx-remote-port>

实施例

jmx-remote-port = 15666      


3。在linux机器上为java进程添加参数

这必须完全像这样。如果它完成如下,它适用于防火墙后面的Linux机器(它起作用-Djava.rmi.server.hostname=localhost参数)。

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=<jmx-remote-port>
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.local.only=false
-Djava.rmi.server.hostname=localhost

实施例

java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=15666 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.local.only=false -Djava.rmi.server.hostname=localhost ch.sushicutta.jmxremote.Main


4。获取Java进程的Process-Id

ps -ef | grep <java-processname>

result ---> <process-id>

实施例

ps -ef | grep ch.sushicutta.jmxremote.Main

result ---> 24321


5。找到RMIServer存根下载的任意端口

java进程在linux机器上打开一个新的TCP端口,可以下载RMI Server-Stubs。此端口还需要通过SSH隧道才能获得与Java虚拟机的连接。

使用netstat -lp可以找到此端口,lsof -i提供了从java进程打开的端口的提示。

注意:启动Java进程时,此端口始终会更改。

netstat -lp | grep <process-id>

tcp        0      0 *:<jmx-remote-port>     *:*     LISTEN      24321/java
tcp        0      0 *:<rmi-server-port>     *:*     LISTEN      24321/java


result ---> <rmi-server-port>

实施例

netstat -lp | grep 24321

tcp        0      0 *:15666     *:*     LISTEN      24321/java
tcp        0      0 *:37123     *:*     LISTEN      24321/java


result ---> 37123


6。使用putty

从Windows计算机启用两个SSH隧道
Source port: <jmx-remote-port>
Destination: localhost:<jmx-remote-port>
[x] Local       
[x] Auto       

Source port: <rmi-server-port>
Destination: localhost:<rmi-server-port>
[x] Local       
[x] Auto

实施例

Source port: 15666
Destination: localhost:15666
[x] Local       
[x] Auto       

Source port: 37123
Destination: localhost:37123
[x] Local       
[x] Auto


Settings to open an SSL tunnel via Putty


7。使用启用此SSH隧道的Putty登录到您的Linux计算机。

让putty会话保持打开状态。

当您登录时,Putty将通过SSH端口22将所有TCP连接隧道连接到Linux计算机。

JMX端口:

Windows machine: localhost:15666   >>> SSH >>>   linux machine: localhost:15666

的RMIServer-存根端口:

Windows Machine: localhost:37123   >>> SSH >>>   linux machine: localhost:37123


8。启动JConsole / Java VisualVM / Java Mission Control以使用以下URL连接到Java Process

这很有效,因为JConsole / Java VisualVM / Java Mission Control认为您连接到本地Windows计算机上的端口。但Putty将所有有效负载发送到您的linux机器的端口15666。

在linux机器上,首先java进程给出答案并发送回RMIServer端口。在这个例子中37123。

然后JConsole / Java VisualVM / Java Mission Control认为它连接到localhost:37123并且putty会将整个有效负载发送到linux机器

java Process回答并且连接已打开。

[x] Remote Process:
service:jmx:rmi:///jndi/rmi://localhost:<jndi-remote-port>/jmxrmi

实施例

[x] Remote Process:
service:jmx:rmi:///jndi/rmi://localhost:15666/jmxrmi


Connect via jmx service url


9。享受#8 - ]

答案 1 :(得分:79)

添加-Djava.rmi.server.hostname='<host ip>'为我解决了这个问题。

答案 2 :(得分:46)

尝试使用Java 8

此解决方案也适用于防火墙

1。将其添加到remote-host上的java启动脚本:

-Dcom.sun.management.jmxremote.port=1616
-Dcom.sun.management.jmxremote.rmi.port=1616
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.local.only=false
-Djava.rmi.server.hostname=localhost

2。在您的计算机上执行此操作。

  • Windows用户

    putty.exe -ssh user@remote-host -L 1616:remote-host:1616

  • Linux和Mac用户

    ssh user@remote-host -L 1616:remote-host:1616

3。在计算机上启动jconsole

jconsole localhost:1616

4。玩得开心!

P.S。:在步骤2中,使用ssh-L指定本地(客户端)主机上的端口1616必须转发到远程端。这是一个ssh隧道,有助于避免防火墙或各种网络问题。

答案 3 :(得分:19)

您可能遇到防火墙问题。 “问题”是您指定的端口不是唯一使用的端口,它为RMI使用1个甚至更多2个端口,并且这些端口可能被防火墙阻止。

如果您使用默认的RMI配置,则不会预先了解其中一个额外端口,因此您必须打开大量端口 - 这可能不会让服务器管理员感到愉快。

有一个解决方案不需要打开很多端口,但我已经使用组合的源代码片段和提示来使用

http://forums.sun.com/thread.jspa?threadID=5267091 - 链接不再有效

http://blogs.oracle.com/jmxetc/entry/connecting_through_firewall_using_jmx

http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html

甚至可以设置一个ssh隧道并让它继续工作: - )

答案 4 :(得分:17)

在过去几天让我的Google-fu参加测试之后,我终于能够在编译Stack Overflow和此页http://help.boomi.com/atomsphere/GUID-F787998C-53C8-4662-AA06-8B1D32F9D55B.html的答案后开始工作。

从Dell Boomi页面重新发布:

To Enable Remote JMX on an Atom

If you want to monitor the status of an Atom, you need to turn on Remote JMX (Java Management Extensions) for the Atom.

Use a text editor to open the <atom_installation_directory>\bin\atom.vmoptions file.

Add the following lines to the file:

-Dcom.sun.management.jmxremote.port=5002
-Dcom.sun.management.jmxremote.rmi.port=5002
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

我没有看到任何Stack Overflow答案封面的一行是

-Dcom.sun.management.jmxremote.rmi.port=5002

在我的情况下,我试图检索Kakfa指标,所以我只是更改了上面的选项以匹配-Dcom.sun.management.jmxremote.port值。因此,如果没有任何类型的身份验证,最小配置应该如下所示:

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.port=(jmx remote port)

-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.rmi.port=(jmx remote port)
-Djava.rmi.server.hostname=(CNAME|IP Address)

答案 5 :(得分:11)

你在Linux上运行吗?管理代理程序可能绑定到localhost:

http://java.sun.com/j2se/1.5.0/docs/guide/management/faq.html#linux1

答案 6 :(得分:7)

Sushicutta的步骤4-7可以通过在步骤3中添加以下行来跳过:

-Dcom.sun.management.jmxremote.rmi.port=<same port as jmx-remote-port>

e.g。 添加启动参数:

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=12345
-Dcom.sun.management.jmxremote.rmi.port=12345
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.local.only=false
-Djava.rmi.server.hostname=localhost

对于端口转发,请使用以下方式连接:

ssh -L 12345:localhost:12345 <username>@<host>

如果您的主人是踩踏石头,只需在上面的步骤石头上运行以下链接就可以向前移动:

ssh -L 12345:localhost:12345 <username>@<host2>

请注意,需要 hostname = localhost 以确保jmxremote告诉rmi连接使用隧道。否则它可能会尝试连接directy并点击防火墙。

答案 7 :(得分:6)

PROTIP:

RMI端口在任意portnr处打开。如果您有防火墙并且不想打开端口1024-65535(或使用vpn),则需要执行以下操作。

您需要修复(如具有已知编号)RMI注册表和JMX / RMI服务器端口。你可以通过在lib-dir中放置一个jar文件(catalina-jmx-remote.jar,它在extra的中)并在服务器下配置一个特殊的监听器来实现这一点:

<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener"
      rmiRegistryPortPlatform="10001" rmiServerPortPlatform="10002" />

(当然是激活JMX的通常标志

    -Dcom.sun.management.jmxremote  \
    -Dcom.sun.management.jmxremote.ssl=false \
    -Dcom.sun.management.jmxremote.authenticate=false \
    -Djava.rmi.server.hostname=<HOSTNAME> \

请参阅:http://tomcat.apache.org/tomcat-6.0-doc/config/listeners.html

上的JMX远程生命周期监听器

然后你可以使用这个可怕的URL连接:

service:jmx:rmi://<hostname>:10002/jndi/rmi://<hostname>:10001/jmxrmi

答案 8 :(得分:5)

检查您的服务器是否在防火墙后面。 JMX基于RMI,它在启动时打开两个端口。一个是注册端口,默认为1099,可以通过com.sun.management.jmxremote.port选项指定。另一种是用于数据通信,并且是随机的,这是导致问题的原因。一个好消息是,从JDK6开始,这个随机端口可以由com.sun.management.jmxremote.rmi.port选项指定。

export CATALINA_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8991 -Dcom.sun.management.jmxremote.rmi.port=8991 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"

答案 9 :(得分:4)

通过防火墙获取JMX真的很难。问题是标准RMI使用第二个随机分配的端口(在RMI注册表旁边)。

我们有三种解决方案可行,但每种情况都需要不同的解决方案:

  1. 使用Socks代理的SSH隧道上的JMX,使用标准的RMI和SSH魔术 http://simplygenius.com/2010/08/jconsole-via-socks-ssh-tunnel.html

  2. JMX MP(标准RMI的替代品),只使用一个固定端口,但在服务器和客户端上需要一个特殊的jar http://meteatamel.wordpress.com/2012/02/13/jmx-rmi-vs-jmxmp/

  3. 启动JMX Server表单代码,可以使用标准RMI并使用固定的第二个端口: https://issues.apache.org/bugzilla/show_bug.cgi?id=39055

答案 10 :(得分:2)

在测试/调试/诊断远程 JMX问题时,首先总是尝试在包含MBeanServer(即localhost)的同一主机上进行连接,以排除网络和其他非JMX特定问题。

答案 11 :(得分:2)

这里已经有了一些很好的答案,但是,我认为值得分享的方法稍微简单一些。

sushicutta的方法很好,但是非常手动,因为你必须每次都获得RMI端口。值得庆幸的是,我们可以通过使用SOCKS代理而不是显式打开端口隧道来解决这个问题。这种方法的缺点是您在计算机上运行的JMX应用程序需要能够配置为使用代理。大多数流程都可以通过添加java属性来实现,但是,某些应用程序不支持此功能。

步骤:

  1. 将JMX选项添加到远程Java服务的启动脚本中:

    -Dcom.sun.management.jmxremote=true
    -Dcom.sun.management.jmxremote.port=8090
    -Dcom.sun.management.jmxremote.ssl=false
    -Dcom.sun.management.jmxremote.authenticate=false
    
  2. 设置与远程计算机的SOCKS代理连接:

    ssh -D 9696 user@remotemachine.com
    
  3. 配置本地Java监控应用程序以使用SOCKS代理(localhost:9696)。注意:您可以有时从命令行执行此操作,即:

    jconsole -J-DsocksProxyHost=localhost -J-DsocksProxyPort=9696
    

答案 12 :(得分:1)

我正在使用boot2docker运行内部有Tomcat的docker容器,我遇到了同样的问题,解决方法是:

  • 添加-Djava.rmi.server.hostname=192.168.59.103
  • 在主机和泊坞窗容器中使用相同的JMX端口,例如:docker run ... -p 9999:9999 ...。使用不同的端口不起作用。

答案 13 :(得分:1)

我在运行Linux Redhat ES3的tomcat上运行JConsole / JVisualVm。

使用以下命令禁用数据包过滤对我来说很有用:

/usr/sbin/iptables -I INPUT -s jconsole-host -p tcp --destination-port jmxremote-port -j ACCEPT

其中jconsole-host是运行JConsole的主机名或主机地址,jmxremote-port是为com.sun.management.jmxremote.port设置的用于远程管理的端口号。

答案 14 :(得分:1)

以下内容对我有用(尽管我认为端口2101对此没有真正的贡献):

-Dcom.sun.management.jmxremote.port=2100
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.rmi.port=2101
-Djava.rmi.server.hostname=<IP_ADDRESS>OR<HOSTNAME>

我正在从远程计算机连接到运行Docker且服务器位于容器内部的服务器。另外,我停止了firewallD,但我认为这不是问题,因为即使打开防火墙也可以远程登录到2100。 希望对您有所帮助。

答案 15 :(得分:0)

这些步骤对我有用(服务器端防火墙后面的debian,通过我本地Mac上的VPN到达):

检查服务器ip

hostname -i

使用JVM参数:

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=[jmx port]
-Dcom.sun.management.jmxremote.local.only=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Djava.rmi.server.hostname=[server ip from step 1]

运行应用程序

找到正在运行的java进程的pid

检查JMX / RMI使用的所有端口

netstat -lp | grep [pid from step 4]

打开防火墙上第5步的所有端口

瞧。

答案 16 :(得分:0)

让JMX通过防火墙并不是那么难。有一个小渔获。你必须转发你的JMX配置端口,即。 9010和它在我的机器上监听的动态端口之一是&gt; 30000

答案 17 :(得分:0)

为了做出贡献,这就是我在CentOS 6.4 for Tomcat 6上所做的。

  1. 关闭iptables服务

    service iptables stop
    
  2. 将以下行添加到tomcat6.conf

    CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=8085 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=[host_ip]"
    
  3. 这样我就可以使用JConsole从另一台PC连接。

答案 18 :(得分:0)

您还需要确保您的计算机名称解析为JMX绑定的IP;不是localhost也不是127.0.0.1。对我来说,它有助于在明确定义它的主机中放入一个条目。

答案 19 :(得分:0)

我正在尝试运行飞行记录器(JFR)以在远程服务器上分析NiFi,该服务器不提供运行JMC的图形环境。

基于此处给出的其他答案,以及经过多次试验和错误,以下是我在启动NiFi时向JVM( conf / bootstrap.conf )提供的内容:

java.arg.90=-Dcom.sun.management.jmxremote=true
java.arg.91=-Dcom.sun.management.jmxremote.port=9098
java.arg.92=-Dcom.sun.management.jmxremote.rmi.port=9098
java.arg.93=-Dcom.sun.management.jmxremote.authenticate=false
java.arg.94=-Dcom.sun.management.jmxremote.ssl=false
java.arg.95=-Dcom.sun.management.jmxremote.local.only=false
java.arg.96=-Djava.rmi.server.hostname=10.10.10.92  (the IP address of my server running NiFi)

我确实把它放在 / etc / hosts 中,但我怀疑它是否需要:

10.10.10.92   localhost

然后,在启动JMC时,我创建了一个具有以下属性的远程连接:

Host: 10.10.10.92
Port: 9098
User: (nothing)
Password: (ibid)

顺便说一句,如果我单击Custom JMX服务URL,我会看到:

service:jmx:rmi:///jndi/rmi://10.10.10.92:9098/jmxrmi

这终于为我做了。