CentOS 上 Tomcat 监控实操指南
一 基础运行与可用性检查
- 使用 systemd 管理服务与状态
- 查看状态:systemctl status tomcat.service
- 启动/停止/重启:systemctl start|stop|restart tomcat.service
- 开机自启:systemctl enable tomcat.service
- 进程与端口快速核验
- 进程:ps -ef | grep tomcat
- 端口(示例):ss -lntp | grep 8080
- 应用可用性探测
- HTTP 探测:curl -I -m 10 -o /dev/null -s -w “%{http_code}” http://localhost:8080/(返回 200 为正常)
- 访问日志自带响应时间
- 在 conf/server.xml 的 Host 内启用 AccessLogValve,并使用模式包含 %D(处理时间,单位微秒),便于定位慢请求与错误率。
二 JVM 与线程的命令行监控
- 基础定位
- 内存与 GC
- 实时 GC/内存:jstat -gc -gccause 2000(每 2000ms 采样一次)
- 线程与死锁排查
- 线程快照:jstack -l > threaddump.txt
- 建议在不同时间点采集 3 次,便于复现与对比
- 堆内存分析
- 生成堆转储:jmap -dump:format=b,file=heap.hprof (分析建议使用 Eclipse MAT)
- 远程图形化(临时排障)
- jconsole / jvisualvm 可查看 内存、线程、类加载、MBeans 等;远程时需在 Tomcat 启动参数中开启 JMX(见下一节)。
三 JMX 远程监控与 Prometheus 指标采集
- 启用 JMX(两种常见方式)
- 方式 A(JVM 参数,简单通用)
- 在 bin/catalina.sh 的 JAVA_OPTS 或 CATALINA_OPTS 中加入:
- -Dcom.sun.management.jmxremote
- -Dcom.sun.management.jmxremote.port=1090
- -Dcom.sun.management.jmxremote.rmi.port=1090
- -Dcom.sun.management.jmxremote.authenticate=false
- -Dcom.sun.management.jmxremote.ssl=false
- -Djava.rmi.server.hostname=<服务器IP>
- 连接示例:service:jmx:rmi:///jndi/rmi://:1090/jmxrmi
- 方式 B(Tomcat 监听器,更规范)
- 在 conf/server.xml 的 Server 内添加:
- Prometheus + JMX Exporter
- 部署:将 jmx_prometheus_javaagent-.jar 放到 $CATALINA_HOME/lib,创建 jmx-exporter.yaml
- 启动参数示例:
- -javaagent:/path/to/jmx_prometheus_javaagent-0.13.0.jar=20000:/path/to/jmx-exporter.yaml
- Prometheus 抓取:在 prometheus.yml 增加 job
- scrape_configs:
- job_name: ‘tomcat’
static_configs:
- 可视化:在 Grafana 导入 Tomcat 仪表盘(如 ID:8563)。
四 进程守护与自动恢复
- systemd 自恢复(推荐)
- 确保 tomcat.service 配置了 Restart=on-failure,异常退出会被 systemd 自动拉起
- Shell 脚本 + Cron 兜底
- 思路:检测进程是否存在;探测 HTTP 200;异常则 kill 旧进程并 startup.sh 重启;记录日志
- 示例关键片段:
- 进程:TomcatID=$(ps -ef | grep tomcat | grep -w ‘apache-tomcat-8.5.35’ | grep -v grep | awk ‘{print $2}’ | head -n1’)
- 探测:code=$(curl -s -o /dev/null -m 10 --connect-timeout 10 http://localhost:8080/ -w “%{http_code}”)
- 重启:[ $code -ne 200 ] && kill -9 $TomcatID && sleep 5 && /path/to/startup.sh
- 定时:*/1 * * * * /path/to/monitor.sh
- 重要提示:若脚本启动失败提示未定义 JAVA_HOME/JRE_HOME,在 bin/setclasspath.sh 顶部显式导出:
- export JAVA_HOME=/usr/local/java/jdk1.8.0_152
- export JRE_HOME=${JAVA_HOME}/jre
- 安全建议:避免频繁 kill -9,可先尝试 graceful 停止;清理 work/ 需谨慎,可能影响正在处理请求。
五 关键指标与告警阈值建议
| 维度 |
关键指标 |
建议阈值 |
说明 |
| 线程池 |
当前活跃线程 / 最大线程 |
75% / 90% |
超过 90% 易出现排队与超时 |
| 请求 |
平均响应时间、错误率 |
>1s、>5% |
结合业务 SLA 调整 |
| JVM |
堆/非堆使用率、GC 暂停 |
80%/85%、200ms/500ms |
长时间 GC 需排查内存或对象生命周期 |
| 会话 |
活跃会话数 |
视应用而定 |
结合业务容量规划 |
| 连接 |
当前连接数、等待队列 |
80%/90%、>50/>100 |
队列过长需扩容或优化慢查询 |
- 告警示例(Prometheus + Alertmanager)
- 高响应时间:
- expr: tomcat_request_seconds_sum / tomcat_request_seconds_count > 1
- for: 5m
- labels.severity: warning
- 说明:阈值与持续时间请结合业务压测与历史基线微调。