在 Java VisualVM 中添加远程虚拟机
Adding remote VMs in Java VisualVM
如果我打开 jvisualvm
并转到 File >> Add Remote Host
,系统会提示我创建一个新的远程服务器条目。我输入主机名 myapp01.example.org
,然后我看到该服务器显示在 Applications
树 left-hand 端的 Remote
部分下。当我 right-click 该服务器并单击 Add JMX Connection
时,我看到以下对话框:
假设我在 myapp01.example.org:8443
上有一个 Java 应用程序(WAR 部署到 Tomcat)运行。要通过 SSH 连接到服务器,我使用用户名 skroob
和密码 12345
(嘿,这是我行李上的组合!):
ssh skroob@myapp01.example.org
skroob@myapp01.example.org's password: 12345
当我填写对话框如下:
- 连接:
myapp01.example.org:8443
- 用户名:
skroob
- 密码:
12345
我收到以下错误:
Cannot connect to skroob@myapp01.example.org:8443 using service:jmxLrmi:///jndi/rmi://myapp01.example.org:8443/jmxrmi
我相信这可能是因为我没有将 JMX 配置为在 Tomcat 本身上公开。或者也许我只是输入了错误的信息。也许两者都有。无论哪种方式:
- 我需要做什么来配置正确的 JMX 信息?
- 我需要做什么才能为
jstatd
正确配置它?
这不是指定 JMX 连接的方式。对于 tomcat,最好的方法是创建一个 bin/setenv.sh 文件这是最好的,因为 Apache 脚本已经设置为查找它并在存在时调用它。
这是您要设置任何安装特定参数的地方。
你会做这样的事情:
#
# PORT for debug
export JPDA_ADDRESS='8000'
echo start with 'jpda start' parameters to enable debugging. Tomcat will listen on $JPDA_ADDRESS
CATALINA_OPTS="\
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=1299 \
-Dcom.sun.management.jmxremote.authenticate=true \
-Dcom.sun.management.jmxremote.password.file=../conf/jmxremote.password \
-Dcom.sun.management.jmxremote.access.file=../conf/jmxremote.access \
-Dcom.sun.management.jmxremote.ssl=false
jmxremote.access:
monitorRole readonly
controlRole readwrite
jmxremote.password:此文件必须由 Tomcat 开头的 ID 只读,否则 JMX 将无法工作!即 chmod 400 jmxremote.password
monitorRole readpass
controlRole changepass
基本上您要设置 2 个 JMX 用户 ID。一个可以访问暴露的吸气剂。另一个也可以访问 setter 和任意 mbean 方法。在实践中,您通常希望提供后者,这样您可以做的不仅仅是看。
所以....
在你上面的对话框中它变成了
- 连接:myapp01.example.org:1299
- 用户名:controlRole
- 密码:changepass
如果我打开 jvisualvm
并转到 File >> Add Remote Host
,系统会提示我创建一个新的远程服务器条目。我输入主机名 myapp01.example.org
,然后我看到该服务器显示在 Applications
树 left-hand 端的 Remote
部分下。当我 right-click 该服务器并单击 Add JMX Connection
时,我看到以下对话框:
假设我在 myapp01.example.org:8443
上有一个 Java 应用程序(WAR 部署到 Tomcat)运行。要通过 SSH 连接到服务器,我使用用户名 skroob
和密码 12345
(嘿,这是我行李上的组合!):
ssh skroob@myapp01.example.org
skroob@myapp01.example.org's password: 12345
当我填写对话框如下:
- 连接:
myapp01.example.org:8443
- 用户名:
skroob
- 密码:
12345
我收到以下错误:
Cannot connect to skroob@myapp01.example.org:8443 using service:jmxLrmi:///jndi/rmi://myapp01.example.org:8443/jmxrmi
我相信这可能是因为我没有将 JMX 配置为在 Tomcat 本身上公开。或者也许我只是输入了错误的信息。也许两者都有。无论哪种方式:
- 我需要做什么来配置正确的 JMX 信息?
- 我需要做什么才能为
jstatd
正确配置它?
这不是指定 JMX 连接的方式。对于 tomcat,最好的方法是创建一个 bin/setenv.sh 文件这是最好的,因为 Apache 脚本已经设置为查找它并在存在时调用它。
这是您要设置任何安装特定参数的地方。
你会做这样的事情:
#
# PORT for debug
export JPDA_ADDRESS='8000'
echo start with 'jpda start' parameters to enable debugging. Tomcat will listen on $JPDA_ADDRESS
CATALINA_OPTS="\
-Dcom.sun.management.jmxremote \
-Dcom.sun.management.jmxremote.port=1299 \
-Dcom.sun.management.jmxremote.authenticate=true \
-Dcom.sun.management.jmxremote.password.file=../conf/jmxremote.password \
-Dcom.sun.management.jmxremote.access.file=../conf/jmxremote.access \
-Dcom.sun.management.jmxremote.ssl=false
jmxremote.access:
monitorRole readonly
controlRole readwrite
jmxremote.password:此文件必须由 Tomcat 开头的 ID 只读,否则 JMX 将无法工作!即 chmod 400 jmxremote.password
monitorRole readpass
controlRole changepass
基本上您要设置 2 个 JMX 用户 ID。一个可以访问暴露的吸气剂。另一个也可以访问 setter 和任意 mbean 方法。在实践中,您通常希望提供后者,这样您可以做的不仅仅是看。
所以.... 在你上面的对话框中它变成了
- 连接:myapp01.example.org:1299
- 用户名:controlRole
- 密码:changepass