Debian下Tomcat资源监控方案
一 监控目标与关键指标
- 业务指标:吞吐(requests/s)、响应时间(平均/最大)、HTTP错误率(4xx/5xx)。
- 运行时指标:JVM堆与非堆内存、GC次数/耗时、线程池使用(当前/繁忙/最大)、连接器队列与拒绝情况。
- 资源与依赖:主机CPU/内存/磁盘IO/网络、数据库/缓存连接池使用与等待。
- 日志与可用性:应用与访问日志错误、服务存活探针(/health 或首页200)。这些指标可通过Tomcat暴露的JMX MBean与日志体系获取,是定位瓶颈与容量规划的核心依据。
二 快速落地方案 原生JMX与可视化工具
- 启用JMX(推荐在$CATALINA_HOME/bin/setenv.sh中配置,便于维护)
- 示例(请替换实际IP与端口,生产环境务必启用认证与SSL):
- CATALINA_OPTS=“$CATALINA_OPTS -Dcom.sun.management.jmxremote”
- CATALINA_OPTS=“$CATALINA_OPTS -Dcom.sun.management.jmxremote.port=1099”
- CATALINA_OPTS=“$CATALINA_OPTS -Dcom.sun.management.jmxremote.rmi.port=1099”
- CATALINA_OPTS=“$CATALINA_OPTS -Djava.rmi.server.hostname=你的服务器IP”
- CATALINA_OPTS=“$CATALINA_OPTS -Dcom.sun.management.jmxremote.authenticate=false”
- CATALINA_OPTS=“$CATALINA_OPTS -Dcom.sun.management.jmxremote.ssl=false”
- 重启Tomcat后用JConsole或VisualVM连接:service tomcat restart 后执行 jconsole 你的IP:1099。
- 在JConsole/VisualVM中重点查看
- MBeans → java.lang → Memory:HeapMemoryUsage(堆使用趋势、是否持续增长)。
- MBeans → java.lang → GarbageCollector:CollectionCount/CollectionTime(GC频率与停顿)。
- MBeans → Catalina → type=ThreadPool,name=http-nio-8080:currentThreadsBusy、currentThreadCount、maxThreads(是否线程饥饿或过多)。
- MBeans → Catalina → type=GlobalRequestProcessor,name=http-nio-8080:requestCount、errorCount、processingTime、maxTime(吞吐、错误率、响应时间)。
- 若使用JNDI数据源:Catalina → type=DataSource,name=“jdbc/YourDS”:numActive、numIdle(连接池瓶颈识别)。以上对象与属性名可直接在JMX客户端中浏览与监控。
三 生产级监控栈 Prometheus JMX Exporter Grafana
- 采集链路
- 主机层:部署node_exporter采集CPU、内存、磁盘、网络等基础指标。
- JVM/Tomcat层:使用JMX Exporter(Java agent)暴露Tomcat/JVM指标;将jmx_exporter.jar与配置放到$CATALINA_HOME/lib,并在setenv.sh中增加JVM启动参数:-javaagent:/opt/tomcat/lib/jmx_exporter.jar=8080:/opt/tomcat/conf/jmx_exporter.yaml(示例将指标暴露在Tomcat的8080/jmx路径,避免与业务端口冲突)。
- 服务可用性:可选blackbox_exporter对/health或首页做HTTP探活。
- Prometheus与告警
- prometheus.yml 抓取目标示例:
- job_name: ‘tomcat’
static_configs:
- targets: [‘tomcat-host:8080’]
- job_name: ‘node’
static_configs:
- targets: [‘tomcat-host:9100’]
- 常用告警规则示例(阈值可按业务调整)
- Tomcat线程池繁忙率高:1 - (sum by(instance)(rate(tomcat_threads_busy{name=“http-nio-8080”}[5m])) / sum by(instance)(rate(tomcat_threads_current{name=“http-nio-8080”}[5m])) > 0.8
- HTTP 5xx比例上升:sum(rate(tomcat_http_requests_total{status=~“5…”}[5m])) / sum(rate(tomcat_http_requests_total[5m])) > 0.01
- JVM Full GC频繁:increase(jvm_gc_collection_seconds_sum{gc=“G1 Full”}[1h]) > 3
- 可视化
- Grafana导入Tomcat/JVM官方或社区仪表盘(如JMX Exporter仪表盘),展示吞吐、响应时间P95/P99、线程池、GC、堆与非堆、连接池等关键面板,并设置阈值告警。
四 轻量内置与日志监控
- 内置Web监控
- JavaMelody:将javamelody-core依赖加入应用(或部署probe.war),访问/monitoring查看内存、线程、SQL、HTTP请求统计与图表,适合快速无侵入接入与问题排查。
- Tomcat Manager:配置conf/tomcat-users.xml添加manager-gui与manager-jmx角色后,访问/manager/html与/manager/jmxproxy可查看状态与部分MBean信息(不建议生产长期开放)。
- 日志监控与轮转
- 实时查看:tail -f $CATALINA_HOME/logs/catalina.out;按关键字(ERROR、OutOfMemoryError、SEVERE)告警分析。
- 日志治理:使用logrotate管理日志大小与保留;集中化分析可用ELK Stack(Elasticsearch/Logstash/Kibana)或Graylog/Splunk构建索引、搜索与可视化。
五 可用性自愈与日常巡检脚本
- 简易自愈脚本(示例思路,生产请增强幂等与安全性)
- 每分钟检测首页HTTP状态码;非200或进程不存在则记录日志并尝试重启Tomcat;示例命令:curl -s -o /tmp/check.html -m 10 --connect-timeout 10 http://localhost:8080/ -w “%{http_code}”;根据返回码执行重启逻辑并记录到日志。
- 日常巡检命令清单
- 进程与资源:top/htop -p $(pidof java);free -m;df -h;iostat -x 1;uptime
- 连接与端口:ss -lntp | grep :8080;netstat -an | grep 8080
- JVM快速诊断:jps;jstat -gc ;jstack (卡顿时抓取线程栈);必要时配合VisualVM远程分析。