【VisualVm】 监控本地虚拟机和远程服务虚拟机(cpu,线程,堆栈等)

1.前言

本文以连接远程Tomcat为模板进行如下介绍,使用VisualVM监控远程主机,主要是要在远程主机上部署JMX服务和jstat服务

VisualVM是到目前为止随JDK发布的功能最强大的运行监视和故障处理程序,它除了运行监视、故障处理外,还提供了很多其他方面的性能。如性能分析(Profiling),VisualVM的性能分析功能甚至比起JProfiler等专业且收费的Profiling工具都不会逊色多少,而且VisualVM还有一个很大的优点:不需要被监视的程序基于特殊Agent运行,因此它对应用程序的实际性能的影响很小,使得它可以直接应用在生产环境中。这个优点是JProfiler等工具无法与之媲美的。

2 工具介绍

2.1 客户端工具

VisualVm 点此下载

VisualVm工具和jdk 自带的工具jvisualvm基本相同,看具体使用习惯

jvisualvm 在jdk目录%JAVA_HOME%/bin 目录下

运行结果如下,可以看到本地的虚拟机进程和远程的进程都可以一并检测的到。
在这里插入图片描述

2.2 环境介绍

客户端环境:VisualVm,MAC, jdk1.8

服务器环境:阿里云 CenterOS,JDK1.8,Tomcat 等

3.安装配置

3.1 添加权限文件

新建文本文件重命名为jstatd.all.policy,并root登陆,上传到linux服务器jdk/bin目录下

grant codebase "file:${java.home}/../lib/tools.jar" {

  permission java.security.AllPermission; 

};  

3.2 确认服务器ip

公网IP:66.22.33.44 私有IP:192.168.1.50 (这两个网络很重要) 公网ip这个是对外使用这个不用做太多解释ssh 连接都要使用这个ip

1. hostname -i 命令来查看当前服务器的内网ip
2. 使用上线这个命令查看结果只要不是127.0.0.1 或者无法识别 下面这个操作可以不处理
3. 手动配置主机名和IP映射,假设主机名是aliyunlinux(可以在阿里云的控制中心命名)
vim /etc/hosts
添加一行。记住这里填的是私有IP,不能是公有IP,不能是公有IP,否则你会被坑得连自己姓什么都不知道
192.168.1.50 aliyunlinux

3.3 部署服务

3.3.1 部署JMX服务,修改catalina.sh文件

进入tomcat的bin目录,修改catalina.sh:
vim catalina.sh
添加如下配置:
CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.password.file=../conf/jmxremote.password 
-Dcom.sun.management.jmxremote.access.file=../conf/jmxremote.access -Djava.rmi.server.hostname=66.22.33.44"

-Dcom.sun.management.jmxremote.ssl 是否开启ssl传输,设为false即可
-Dcom.sun.management.jmxremote.authenticate 是否校验,设为false即可
-Dcom.sun.management.jmxremote.password.file 远程登录的账号管理文件,下文会讲到如何获取
-Dcom.sun.management.jmxremote.access.file 同上
-Djava.rmi.server.hostname 这个很重要,如果不填的话,可以重启成功,按时客户端的jvisual是无法远程连接上的,这里的IP必须是公网IP,公网IP

3.3.2 添加jmx的端口监听

#进入tomcat的conf:
vim server.xml
#添加如下的监听配置。其中10001和10002是自定义的两个端口,用于远程连接需要
<!-- 远程监控 -->
<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" rmiRegistryPortPlatform="10001" rmiServerPortPlatform="10002" />

3.3.3 添加jmx权限控制文件

#进入tomcat/conf的目录
#执行以下命令
cp $JAVA_HOME/jre/lib/management/jmxremote.password.template jmxremote.password
cp $JAVA_HOME/jre/lib/management/jmxremote.access jmxremote.access
vi jmxremote.password

#取消下面两行的注释,取消注释表示你可以使用这两个账号进行远程登录
#monitorRole QED
#controlRole R&D

#也可以自定义账号,格式如 username passwd,如我想要添加一个zexin的账号,密码是123
vim jmxremote.password
##在最后一行添加
zexin 123
##修改完jmxremote.password文件,还要修改jmxremote.access文件,添加权限
zexin readwrite

chmod 600 jmxremote.password
chmod 600 jmxremote.access 

3.3.4 配置端口安全组

阿里云的端口安全组配置不是通过防火墙的ip来配置的,网上很多博客都是说通过etc/sysconfig/iptables请注意实际情况进行区分

阿里云的安全组的示例如下
在这里插入图片描述

在这里插入图片描述

3.3.5 添加jmx 远程连接服务jar

jar包所在地址:http://mvnrepository.com/artifact/org.apache.tomcat/tomcat-catalina-jmx-remote

这里要注意的是,该jar文件现在最高已经到了9.0版本,我的jdk版本是1.8,tomcat版本是7,我下载了9.0的版本重启服务器会报类找不到的异常,所以低于或等于我的配置的同学请选择7.0的版本。下载后copy到tomcat/lib目录。

3.3.6 重启tomcat

重启tomcat,然后检查对外开放的端口是否开启,本文以10001端口为例

#tomcat关闭
%TOMCAT_HOME%/bin/shutdown.sh
#tomcat启动
%TOMCAT_HOME%/bin/startup.sh
#检查端口是否启动
netstat -tupln |grep 10001

3.4 客户端连接

客户端连接通过VisualVm客户端工具,添加Jmx连接方式进行远程连接

3.4.1 添加远程主机

在这里插入图片描述

3.4.2 添加JMX配置

JMX基础配置

基础配置如下图,具体参数参考以上说明
ip:开放的端口号
用户名:服务器 jmxremote.password文件配置的用户名
密码:服务器 jmxremote.password文件配置的密码

在这里插入图片描述
连接成功案例
在这里插入图片描述

4. 记录问题

4.1 jmx连接不上的几个可能

  • Tomcat 或者端口未启动成功

此问题参考 3.3.5 ,检查相应的服务和端口是否启动

  • VisualVm及配置问题

此问题参考3.4 客户端连接,注意外网ip及端口的配置

  • 重启阿里云服务器

如果发现基础配置都不起作用,注意重启阿里云服务器

  • 必要的插件更新也是要点点的
    在这里插入图片描述

5.参考

[1] : https://blog.csdn.net/autfish/article/details/51326340
[2] : https://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstatd.html

猜你喜欢

转载自blog.csdn.net/zhujohnle/article/details/88073390
今日推荐