zabbix监控——利用JMX监控Tomcat

本文详细介绍如何在Zabbix环境中配置Java应用监控,包括安装Zabbix组件、设置Apache Tomcat远程JMX、配置Zabbix Java Gateway及Server端,实现对Java应用程序性能指标的收集。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境说明

  • 已关闭防火墙、selinux;
  • 已通过YUM安装Zabbix,安装方法请见zabbix官网
  • 所用IP地址、角色及安装内容如下表:
IP地址角色安装内容
192.168.91.134serverzabbix-server-mysql、zabbix-web-mysql、mariadb-server、mariadb
192.168.91.133agentzabbix-java-gateway、java-openjdk、apache-tomcat

原理图

在这里插入图片描述

  • 当Zabbix-Server需要知道java应用程序的某项性能的时候,会启动自身的一个Zabbix-JavaPollers进程去连接Zabbix-JavaGateway请求数据,
  • ZabbixJavagateway收到请求后使用“JMXmanagementAPI”去查询特定的应用程序,而前提是应用程序这端在开启时需要“-Dcom.sun.management.jmxremote”参数来开启JMX远程查询就行。
  • Java程序会启动自身的一个简单的小程序端口12345向Zabbix-JavaGateway提供请求数据。

配置

Agent(192.168.91.134)端配置

  • 安装zabbix-java-gateway(此包在zabbix YUM源中),下载apache-tomcat,解压并使用
[root@localhost ~]# yum -y install zabbix-java-gateway    ##源码编译加--enable-java
[root@localhost ~]# yum -y install java-openjdk
java-1.8.0-openjdk.x86_64
[root@localhost ~]# wget http://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.14/bin/apache-tomcat-9.0.14.tar.gz
[root@localhost ~]# tar -xf apache-tomcat-9.0.14.tar.gz 
[root@localhost ~]# mv apache-tomcat-9.0.14 /usr/local/tomcat
  • 设置环境变量
[root@localhost ~]# vim /etc/profile.d/tomcat.sh
[root@localhost ~]# source /etc/profile.d/tomcat.sh
[root@localhost ~]# echo $PATH
/usr/local/tomcat/bin/:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
  • 启动tomcat
[root@localhost ~]# catalina.sh start
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
  • 开启tomcat的远程jvm配置文件
[root@localhost tomcat]# vim /usr/local/tomcat/bin/catalina.sh
CATALINA_OPTS="$CATALINA_OPTS
## 启用远程监控JMX
-Dcom.sun.management.jmxremote
## jmx启用远程端口,Zabbix添加时必须一致
-Dcom.sun.management.jmxremote.port=12345
## 不开启用户认证
-Dcom.sun.management.jmxremote.authenticate=false
## 不启用ssl加密传输
-Dcom.sun.management.jmxremote.ssl=false
## 运行tomcat主机的IP地址
-Djava.rmi.server.hostname=192.168.91.134"
  • 重新启动tomcat
[root@localhost tomcat]# catalina.sh stop
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
[root@localhost tomcat]# catalina.sh start
Using CATALINA_BASE:   /usr/local/tomcat
Using CATALINA_HOME:   /usr/local/tomcat
Using CATALINA_TMPDIR: /usr/local/tomcat/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar
Tomcat started.
  • 启动zabbix-java-gateway服务
[root@localhost tomcat]# systemctl restart zabbix-java-gateway
[root@localhost tomcat]# ss -ntl
State      Recv-Q Send-Q   Local Address:Port      Peer Address:Port                         
LISTEN     0      50                  :::10052               :::*                  

Server(192.168.91.133)端配置

  • 修改zabbix_server.conf配置文件
[root@localhost ~]# vim /etc/zabbix/zabbix_server.conf
## java gateway地址
JavaGateway=192.168.91.134
## java gateway默认端口10052
JavaGatewayPort=10052
## 启动进程轮询java gateway
StartJavaPollers=5
  • 重启zabbix-server服务
[root@localhost ~]# systemctl restart zabbix-server

Zabbix Web端配置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

<think>嗯,用户这次的问题是关于如何监控Tomcat内存使用以防止溢出,正好接续我上次关于内存溢出解决方案的讨论。用户可能是个运维工程师或Java开发者,正在生产环境遇到实际问题,情绪上有些焦虑——毕竟内存溢出会导致服务崩溃,SSH都连不上。 从引用内容看,用户特别关注三点:一是内存使用的动态监控(引用1提到并发量高时内存增长),二是长期运行后的累积泄漏(引用2描述内存从5%飙升到40%),三是不同启动方式下的监控差异(引用4提到Windows服务启动的特殊性)。需要覆盖命令行工具、图形工具和日志分析三种主流方式。 首先得强调监控的层次性:JVM自带工具最直接,但生产环境更依赖日志和远程监控。jstat和jconsole虽然强大,但很多服务器不允许装GUI,所以重点讲命令行和JMX远程连接。对于引用4提到的Windows服务启动问题,要单独说明注册表配置方式,避免用户踩坑。 用户没提具体Tomcat版本,但引用3提到Java 8的Metaspace,说明环境较新。监控方案需要兼容新旧版本,比如PermGen监控在Java 8+要调整为Metaspace。另外,用户可能没意识到线程泄漏也会导致内存问题,需要补充线程栈监控。 最后考虑给出实用建议:比如设置内存阈值报警(85%就预警),还有HeapDump参数配置技巧。用户上次提到问题持续一个月才解决,说明缺乏有效监控手段,这部分要详细展开。压力测试建议也很关键,引用1强调高并发场景,可以用JMeter模拟。 相关问题的设计要延续深度:内存分析工具对比、云环境监控差异、容器化部署的注意事项——这些都是用户后续可能遇到的延伸问题。</think>监控Tomcat内存使用是预防内存溢出的核心手段,以下是分层监控方案及实施步骤: --- ### 一、**基础监控工具** #### 1. **JVM内置工具** - **`jstat`(命令行实时监控)** 监控堆/非堆内存使用率及GC活动: ```bash jstat -gcutil <Tomcat进程PID> 1000 # 每秒刷新一次 ``` 输出示例: ``` S0 S1 E O M CCS YGC YGCT FGC FGCT GCT 0.00 99.80 68.43 85.22 94.23 90.11 215 6.325 12 3.141 9.466 ``` - **关键列**: `O`:老年代使用率(>80%需警惕) `M`:Metaspace使用率(Java 8+) `FGC`:Full GC次数(突增可能泄漏)[^1][^3] - **`jconsole`/`VisualVM`(图形化监控)** 远程连接Tomcat(需启用JMX): ```bash # 在catalina.sh中添加 JAVA_OPTS="-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false" ``` 实时查看内存曲线、线程状态、类加载数。 --- ### 二、**日志分析与预警配置** #### 1. **GC日志监控** 启动参数添加GC日志记录: ```bash JAVA_OPTS="-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/opt/tomcat/logs/gc.log" ``` 使用工具(如`GCViewer`)分析日志,关注: - **Full GC频率**:频繁Full GC可能内存不足 - **GC后内存回收率**:回收率低说明存在无法释放的对象[^1][^4] #### 2. **内存溢出自动转储** 当OOM时自动生成堆转储文件: ```bash JAVA_OPTS="-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/opt/tomcat/dumps/" ``` 用**Eclipse MAT**分析`heapdump.hprof`,定位泄漏对象(如占内存最大的`HashMap`)[^2][^3]。 --- ### 三、**生产环境监控体系** #### 1. **APM工具链** 工具 | 功能 | 关键指标 ---|---|--- **Prometheus + Grafana** | 时序数据可视化 | JVM内存使用率、GC时间、线程数 **Elastic APM** | 代码级追踪 | 慢方法检测、SQL查询分析 **Zabbix** | 阈值告警 | 内存>85%自动通知 #### 2. **Tomcat管理接口** 启用`manager-status`(需配置`conf/tomcat-users.xml`): ```xml <role rolename="manager-gui"/> <user username="admin" password="密码" roles="manager-gui"/> ``` 访问 `http://server:port/manager/status` 查看实时内存、会话数。 --- ### 四、**关键预防策略** 1. **阈值设置原则** - 堆内存(`-Xmx`):不超过物理内存70% - Metaspace(Java 8+):`-XX:MaxMetaspaceSize=256m`(默认无上限需手动约束)[^2][^4] 2. **定期压力测试** 用JMeter模拟高并发,观察内存增长斜率: ```bash jmeter -n -t test_plan.jmx -l result.jtl ``` 3. **容器化部署建议** Docker中限制容器内存,避免单个Tomcat耗尽宿主机资源: ```bash docker run -d --memory=2g --name=tomcat-app tomcat:9 ``` --- ### 五、**常见内存泄漏场景排查 场景 | 检测方法 | 修复方案 ---|---|--- **未关闭流** | `lsof -p <PID>`查打开文件数 | `try-with-resources`自动关闭 **静态集合累积** | MAT分析`java.util.*`对象 | 改用WeakReference或定期清理 **线程泄漏** | `jstack <PID>`检查线程名 | 使用线程池并设超时时间 **Session堆积** | `manager/status`查会话数 | 配置`web.xml`中`<session-timeout>`[^2][^3] --- > **最佳实践**:某电商平台通过`Prometheus`监控发现Metaspace持续增长,分析为热部署导致类加载残留。通过添加`-XX:+CMSClassUnloadingEnabled`参数,Metaspace使用率稳定下降40%[^1][^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值