由于我们的生产系统架构是一台与主机挂了四台tomcat,主机内存8G,我担心访问量大了之后会OOM,所以想用jvisualVM把虚拟机监控起来,于是乎网上一顿找,基本上讲的都是分两类监控模式,一种是rmi,一种是jstatd,rmi的很顺利的完成了,但是关于jstatd的监控却始终不行,下面湿解决rmi与jstatd监控的终级办法。
1 配置前的准备
我们需要先检查linux的hostname匹配的IP,执行
hostname -i
如果匹配的结果是无法识别或者127.0.0.1, 则需要手动配置主机名和IP映射。假设要用于建立连接的IP是49.92.35.31,主机名是abc:
vi /etc/hosts
添加一行
49.92.35.31 abc
2 配置JMX
2.1 创建setenv.sh
进入tomcat/bin目录
添加文件
setenv.sh 内容为:
JAVA_OPTS="-Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=49.92.35.31"
设置权限
chmod +x setenv.sh
2.2 在要监听的tomcat/conf/server.xml中添加listener
- <Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="10001" rmiServerPortPlatform="10002" />
2.3 JMX访问控制文件
进入tomcat/conf目录
添加jmxremote.access与jmxremote.password两个文件,文件内容网上都有,可以查找,就是jvisualvm.exe远程连接的密码
修改权限
chmod 600 jmxremote.password
chmod 600 jmxremote.access
2.4 添加catalina-jmx-remote.jar
将此ja包放入tomcat/lib目录里
开启防火墙
开启tomcat
在客户机上telnet 服务器的10001和10002端口,如果都通就正确了。
2.6 测试
在客户机上启动jvisualvm.exe,在左侧树形菜单的远程上右键 -> 添加远程主机,主机名填写服务器IP
确定后,远程下出现新的子节点,在子节点上右键 -> 添加JMX连接
连接输入(ipconfig)IP:10001,注意这个端口是2.2步骤中配置的rmiRegistryPort。勾选使用安全凭证,用户名和口令即2.3步骤中jmxremote.password文件内的用户名和对应密码。勾选保存安全凭证(不使用安全凭证也可登录)
本文的配置中未启用SSL,点确定后会提示“请确认不用SSL方式尝试连接”,选择“是”。如果一切顺利在服务器节点下出现JMX连接子节点,双击后即可打开功能界面。
尝试一下强大的Visual GC插件,很遗憾,提示"不受此JVM支持“,如果想使用这个插件,就需要配置jstatd连接方式,下面来看jstatd的配置。
vi $JAVA_HOME/jre/lib/security/java.policy
在文件末位的 }; 前添加
permission java.security.AllPermission;
3.2 启动jstatd
cd $JAVA_HOME/bin
创建jstatd.all.policy文件,文件内容:
grant codebase "file:${java.home}/../lib/tools.jar" {
permission java.security.AllPermission;
};
保存退出
执行./jstatd -J-Djava.security.policy=jstatd.all.policy -J-Djava.rmi.server.hostname=47.92.35.36 -p 10003 -J-Djava.rmi.server.logCalls=false
注释:-J-Djava.rmi.server.logCalls=true 打开日志,如果客户端有连接过来的请求,可以监控到,便于排错;
3.3查看jstatd端口:
执行 netstat -anp
找到 jstatd对应的连个端口。需要将这两个端口都释放在防火墙之外,并且每次重启jstatd,一个随机端口会变化,需要重新释放最后以jstatd方式远程连接,输入此端口 或者 10003, 等2分钟都试一下,有的时候都管用,有的时候只有一个管用
至此,大功告成