背景
项目后端架构使用 Tomcat 作为 Web 服务的容器,在系统设计之初,考虑到大量并发的情况,将后端拆分成若干个模块,分别通过部署在集群中的 Tomcat 加载,这些 Tomcat 能否正常工作并且在业务高峰承受住大量的请求,成为了关键。
一开始搭建监控体系时,仅仅监控了集群中每台服务器系统的各项指标,也就是只添加了 Template OS Linux 模板,对 Tomcat 进程的状态很难把控。
JMX
JMX在Java编程语言中定义了应用程序以及网络管理和监控的体系结构、设计模式、应用程序接口以及服务。通常使用JMX来监控系统的运行状态或管理系统的某些方面,比如清空缓存、重新加载配置文件等
优点可以非常容易的使应用程序具有被管理
伸缩性的架构每个JMX Agent服务可以很容易的放入到Agent中,每个JMX的实现都提供几个核心的Agent服务,你也可以自己编写服务,服务可以很容易的部署,取消部署。
主要提供接口,允许有不同的实现
---------- 摘自《百度百科》
zabbix 监控 tomcat,实际上也是通过 Java 自己的 JMX 来获取数据的,tomcat 需要配置 JMX。
配置 Tomcat JMX
- 安装 JDK、tomcat
官网下载 java jdk 到服务器,配置 /etc/peofile
JAVA_HOME=/usr/java/jdk1.7.0
JRE_HOME=/usr/java/jdk1.7.0/jre
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
官网下载 tomcat
配置 tomcat JMX,编辑 ./bin/catalina.sh
CATALINA_OPTS="-Dcom.sun.management.jmxremote=ture
-Djavax.management.builder.initial=
-Djava.rmi.server.hostname=10.12.41.127 #tomcat IP
-Dcom.sun.management.jmxremote.port=12345
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
"
# ----- Execute The Requested Command 在这行上面添加
配置 zabbix
详细安装参考:
传送门:https://my.oschina.net/u/2470065/blog/716047
编译安装 zabbix 时需要添加其对 Java 支持(--enable-java):
./configure --prefix=/usr/local/zabbix-3.0.3 --enable-server --enable-agent --with-mysql --with-net-snmp --with-libcurl --with-libxml2 --enable-java
zabbix_server 开启 java poller,zabbix_java 开启 JavaGateway,端口为 10052,tomcat JMX 开启 12345 提供性能数据;
修改 JavaGateway 的配置文件,$zabbix_server_home/sbin/zabbix_java/settings.sh:
LISTEN_IP="0.0.0.0" #监听地址
LISTEN_PORT=10052 #监听端口
START_POLLERS=5 # 开启的工作线程数(必须大于等于后面zabbix_server.conf文件的StartJavaPollers参数)
启动 JavaGateway:$zabbix_server_home/sbin/zabbix_java/startup.sh
修改 zabbix_server 的配置文件:
JavaGateway=127.0.0.1 # JavaGateway 服务器地址,zabbix_server与zabbix_java_gateway在同一台主机
JavaGatewayPort=10052 #端口
StartJavaPollers=5
启动 zabbix_server:$zabbix_server_home/sbin/zabbix_server
Zabbix 图形界面配置
主机添加 JMX 接口:
zabbix 自带两个监控 Tomcat 的模板:Template JMX Generic、Template JMX Tomcat,实际使用的是从网上下载一个 Template:
curl -O https://raw.githubusercontent.com/liujun1990/zabbix/master/zbx_templates_tomcat.xml
导入进模板列表中,添加 Template App Tomcat
zabbix tomcat 监控项
- Session:活跃的 session、被系统拒绝的、最大限制 session 数量
- class status:总共加载的 class、加载的 class 数、未加载 class 数
- heap memory:总共堆内存、commit 的堆内存、使用的堆内存
- session status:active 会话数、session 数、拒绝数、最大 active 数
- thread status:线程数、线程峰值、总共 start 线程数
堆(Heap)和非堆(Non-heap)内存
按照官方的说法:“Java 虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是 Java 代码可及的内存,是留给开发人员使用的;非堆就是JVM留给 自己用的,所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法 的代码都在非堆内存中。