VisualVM远程监控配置
Posted on: 2013-12-31, Last modified: 2015-07-31, View: 8595

一 . 测试环境:       

1、服务器:VirtualBox 虚拟机下 CentOS6.4 x86
2、客户机:Windows7 x64
3、JDK:jdk1.7.0_45
4、Tomcat:apache-tomcat-7.0.47
5、监控工具:VisualVM1.3.6(这是从官网另外下载的,也可以使用 JDK 自带的,在 JAVA_HOME/bin 目录下)

二 . 环境准备及说明      

1、安装好 VirtualBox 虚拟机以及 CentOS 系统,值得注意的是,虚拟机的网络连接方式一定要选择“桥接”,否则远程监控的时候会连不上;(因为这个浪费了不少时间o(╯□╰)o)

2、安装好 Linux 下的 JDK、Tomcat 并配置好相关环境变量,我的机器里 JAVA_HOME=/usr/local/jdk1.7.0_45    CATALINA_HOME=/usr/local/apache-tomcat-7.0.47;

3、VisualVM 下载好相关插件,我只下载了 VisualGC 和 MBeans;

4、建议配置远程监控时,先关闭服务器防火墙,远程连接配置成功后,再进行防火墙的相关配置并开启,这里客户机 IP 假设为 11.22.33.44;

5、任何新建文件在使用前,都应先赋权限。

三 . 配置 VisualVM 远程监控 —— Jstatd 模式        

VisualVM 远程监控可以用两种模式,分别为 Jstatd 和 JMX ,其中 Jstatd 能自动检测被监控服务器上的所有 JAVA 应用程序,而且能使用 VisualGC ,但是由很多其他插件无法使用,如 MBeans;而 JMX 可以使用很多 VisualVM 提供的插件,当 Jstatd 和 JMX 同时启用时,在 JMX 连接下也能看到 VisualGC ,所以推荐同时使用。
配置 Jstatd 相对比较简单,一定要先把防火墙关掉!!!(在这里又浪费了不少时间,菜鸟伤不起 o(╯□╰)o)


1、在 /usr/local/jdk1.7.0_45/bin 目录下新建文件,命名为 jstatd.all.policy(名字可以自己起,后缀一定要是 .policy),该文件是启动 jstatd 时所采用的安全策略文件,若没有指定安全策略,会出现“Could not create remote objectaccess denied”错误;


2、在新建的 jstatd.all.policy 文件下添加如下内容:

grant codebase "file:${java.home}/../lib/tools.jar" {  
permission java.security.AllPermission;  
};  

& 注:这里的 java.home 不一定是 JAVA_HOME 目录,而是 JRE 目录;


3、给 jstatd.all.policy 文件赋权限,我用的是 chmod 755 jstatd.all.policy ;
4、在 /etc/hosts 文件中设置 localhost IP 地址和 hostname 的映射,设置完后用 hostname -i查看,要和本机真实 IP 地址一致(用ifconfig 查看);


5、在终端执行以下命令启动 jstatd :

jstatd -J-Djava.security.policy = /usr/local/jdk1.7.0_45/bin/jstatd.all.policy 

 & 注:这里最好如上述命令指明绝对路径,否则可能由于找不到该安全策略文件,仍然报“Could not create remote objectaccess denied”错;


6、是否启动成功可以通过在终端输入 jps 命令查看,若有 Jstatd 则表示已经启动成功;
7、启动 jstatd 时还可以开启日志功能,同时可以通过 -p 参数指定端口(默认为1099):

-J-Djava.rmi.server.logCalls=true

  & 注:未启用日志功能时,即便 jstatd 开启成功,在终端也不会有任何反应(开始以为卡了。。。默哀),此外,jstatd 开启时需要监听两个端口,除了默认的1099 或者指定的端口外,还需要监听一个,这个端口是随机的,而且建立连接时优先用随机的那个端口,我也没弄清楚到底是怎么回事,所以才建议先关闭防火墙;


8、上述配置均在服务器上,接下来在 VisualVM 中建立远程连接,右击“远程” -> 添加远程主机 -> 键入主机 IP -> 确定,若先前配置成功,应该能看到 Jstatd 连接,若在启动 jstatd 时自定义了端口号,则需要在添加远程主机时,在“高级设置”中指定对应端口;


9、添加防火墙白名单,在 /etc/sysconfig/iptables 中添加如下条目:

-A INPUT -p tcp -m state --state NEW -m tcp -s 11.22.33.44 -j ACCEPT

  & 注:Jstatd 采用的是 TCP 协议,这里允许来自 11.22.33.44 上的所有访问通过,添加在 22 端口后面,保存后终端执行 service iptables restart重启防火墙,重启 jstatd 服务后,在 VisualVM 中能看到,至此 Jstatd 模式配置完毕;


10、安全策略还有其他配置方式,比如将 permission java.security.AllPermission; 添加到 /usr/local/jdk1.7.0_45/jre/lib/security/java.policy 中,或是采用如下的 jstatd.sh 文件:

#!/bin/sh  
policy=${HOME}/.jstatd.all.policy  
[ -r ${policy} ] || cat >${policy} <<'POLICY'  
grant codebase "file:${java.home}/../lib/tools.jar" {  
  permission java.security.AllPermission;  
};  
POLICY  
  
jstatd -J-Djava.security.policy=${policy}  
#-J-Djava.rmi.server.logCalls=true

& 注:不建议将安全策略添加到 java.policy 中。

四 . 配置 VisualVM 远程监控 —— JMX 模式                

JMX 模式的配置相对麻烦一点,具体如下:
1、在 /usr/local/apache-tomcat-7.0.47/conf/server.xml中找到Listener相关部分,在后面加上如下语句:

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

 & 注:这里的 10001 端口就是之后 JMX 连接需要提供的端口;


2、在 /usr/local/apache-tomcat-7.0.47/bin/catalina.sh中添加如下语句:

CATALINA_OPTS="-Dcom.sun.management.jmxremote.password.file=$CATALINA_HOME/conf/jmxremote.password -Dcom.sun.management.jmxremote.access.file=$CATALINA_HOME/conf/jmxremote.access -Dcom.sun.management.jmxremote.ssl=false"

  & 注:这行参数的意思是:使用指定的 jmxremote.password 和 jmxremote.access 控制访问权限,并禁用 ssl 连接。此外,这里还可以使用JAVA_OPTS 代替CATALINA_OPTS,如果使用则一定要在其前面加上“export”,否则Tomcat 7 不识别 JAVA_OPTS 参数。另外这里的 $CATALINA_HOME 最好换成绝对路径,否则在后面应用 Tomcat 启动脚本启动时,会因为找不到 jmxremote.password 和jmxremote.access 这两个文件而启动失败。还有,网上说 CATALINA_OPTS 和 JAVA_OPTS 这两个参数没有什么区别,配任何一个都可以,实际上在 catalina.sh 文件的注释里面已经讲得很清楚了,CATALINA_OPTS 是只针对于 Tomcat 自身,有很多限制,而 JAVA_OPTS 则使用范围更广,可以配一些 CATALINA_OPTS 里没有的参数,这里因为只需要监控 Tomcat 所以选择 CATALINA_OPTS。


3、到 /usr/local/jdk1.7.0_45/jre/lib/management 下找到 jmxremote.access 和 jmxremote.password.template 文件,并复制到/usr/local/apache-tomcat-7.0.47/conf/ 文件夹下,注意将 jmxremote.password.template 的“.template”去掉。别忘了分别给两个文件赋权限 chmod 600。然后分别打开两个文件做如下修改:

jmxremote.password:注释掉所有原本信息,在最后添加“Username password”,即 VisualVM 的登录用户名和密码;
jmxremote.access:注释掉所有原本信息,在最后添加“Username readwrite”,即控制相应登录用户的权限;

 

4、防火墙设置(由于先前配置 Jstatd 的时候已经设置好了,故这里可以略过);
5、到 http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.47/bin/extras/ 下载 catalina-jmx-remote.jar文件,并放入/usr/local/apache-tomcat-7.0.47/lib 中;


6、在 VisualVM 中右击刚才建立的远程电脑,添加 JMX 连接,这里需要输入端口号,即刚才配置监听的 10001 端口,直接在冒号后面加就行,直接点确定后,若弹出输入用户名密码的对话框,则说明已经配置成功。如果同时开着 Jstatd,则在 JMX 连接里,也可以看到 VisualGC 的内容。

From: http://blog.csdn.net/yiquduanzhang/article/details/17427133
Go
Friend Links:
Sonft