在 CentOS 上监控 JSP 应用性能,建议从系统资源、JVM/Tomcat、日志与应用指标以及可视化告警四个层面构建闭环,既能快速定位瓶颈,又能持续观察优化效果。
监控体系与工具总览
| 层面 |
关键指标 |
常用工具 |
典型用途 |
| 系统资源 |
CPU、内存、磁盘 I/O、网络 |
top/htop、vmstat、iostat、df、iftop、sar |
发现主机级瓶颈(CPU 饱和、I/O 等待、磁盘满) |
| JVM/Tomcat |
GC 次数/时间、堆内存、线程数/状态、类加载、连接器队列/线程 |
jps、jstat、jstack、jmap、jinfo、VisualVM/JMC、Tomcat Manager/status |
定位内存泄漏、GC 抖动、线程阻塞、连接器瓶颈 |
| 日志与应用 |
访问日志、错误日志、HTTP 响应时间/状态码 |
Tomcat catalina.out、localhost.log*、error.log、Shell/Python 脚本 |
发现错误激增、慢请求、异常堆栈 |
| 可视化与告警 |
指标时序、可视化面板、阈值告警 |
Prometheus + JMX Exporter + Grafana、New Relic/Datadog |
统一观测、趋势分析、主动告警 |
| 以上工具与方法适用于在 CentOS 上运行的 JSP/Tomcat 场景,可组合形成从主机到应用的立体监控。 |
|
|
|
快速上手步骤
- 定位 Java/Tomcat 进程:使用 jps 或 ps -ef | grep java 获取 PID。
- 实时看资源:用 top/htop 观察 CPU%/MEM%;vmstat 1 关注 si/so(换入/换出)、wa(I/O 等待);iostat -x 1 查看磁盘 await/r/s/w/s;df -h 检查磁盘空间;iftop 观察带宽占用。
- 看 JVM 运行时:
- jstat -gcutil 1 10(每秒采样,共 10 次)观察 S0/S1/E/O/M/YGC/YGCT/FGC/FGCT/GCT;
- jstack 抓取线程栈,排查 BLOCKED/WAITING;
- jmap -heap 或 jmap -histo:live 查看堆与对象分布;
- jinfo 查看/确认 JVM 参数。
- 看 Tomcat 状态:访问 http://:8080/manager/status(需配置用户权限),观察 线程池、请求数、错误数 等;必要时用 VisualVM/JMC 远程连接分析。
- 看日志:分析 catalina.out、localhost.log*、error.log,关注 ERROR/Exception、长堆栈与频繁慢请求。
以上步骤覆盖了从系统到 JVM 再到 Tomcat 的常用“第一响应”手段。
JVM 与 Tomcat 深度监控
- 开启并分析 GC 日志:在 CATALINA_OPTS 中加入
- -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/var/log/tomcat/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=10M;
- 用 jstat -gcutil 或可视化工具观察 YGC/FGC 频率与时长,判断是否存在 GC 停顿过长 或 频繁 Full GC。
- 线程与内存诊断:
- 高 CPU:多次 jstack 采样,统计 RUNNABLE 热点方法;
- 疑似死锁/阻塞:在 jstack 输出中查找 Found one Java-level deadlock;
- 内存泄漏:对比多次 jmap -histo:live 或 jmap -dump 快照,定位增长最快的类与 GC Root 引用链。
- Tomcat 连接器关键参数(server.xml):
- 协议与并发:protocol=“HTTP/1.1”(或 NIO/APR),maxThreads(如 200–1000,视资源而定)、minSpareThreads、maxSpareThreads、acceptCount;
- 网络与压缩:connectionTimeout=“20000”、enableLookups=“false”、compression=“on”、compressionMinSize=“2048”、compressableMimeType=“text/html,text/xml,text/javascript,text/css,text/plain”、URIEncoding=“UTF-8”;
- 这些设置直接影响 并发吞吐、排队与响应时间,应结合压测微调。
- 远程可视化:配置 JMX 后用 VisualVM/JMC 远程连接,进行 CPU 抽样、内存分配追踪、线程分析 与 MBean 观测。
以上做法可系统化观测 GC/堆/线程 与 Tomcat 连接器 的健康度与瓶颈点。
指标采集可视化与告警
- Prometheus + JMX Exporter + Grafana:
- 在 Tomcat 启动参数中暴露 JMX(如 -Dcom.sun.management.jmxremote 等),部署 JMX Exporter 作为 Java Agent 输出 Prometheus 指标;
- Prometheus 定时抓取,在 Grafana 构建 JVM/Tomcat/主机 面板,配置 阈值告警(如 FGC 次数突增、线程池用尽、响应时间 P95 飙升)。
- 日志到指标:用 Shell/Python 定期解析 access.log,统计 HTTP 状态码分布、P95/P99 响应时间、RPS,写入 Prometheus 或时序库,实现 业务级 SLA 观测。
- 商业 APM:接入 New Relic/Datadog,获得 分布式追踪、错误追踪 与 端到端性能 视图。
该方案适合长期运营与容量规划,能在问题扩大前提供可行动的告警与趋势数据。
常见瓶颈与优化方向
- 系统层:持续 si/so>0 或 wa 高 时,优先排查 磁盘 I/O 与 内存不足;iftop 显示带宽打满时考虑 压缩/限速/CDN。
- JVM 层:FGC 频繁/停顿长 时,优先检查 对象生命周期、缓存/会话膨胀 与 堆大小;必要时调整 GC 策略(如 G1GC),并控制 对象晋升 与 大对象 分配。
- Tomcat 层:线程池用尽/请求排队 时,结合 CPU/DB 能力调优 maxThreads/acceptCount;开启 压缩 与 关闭 DNS 反查 降低延迟;静态资源交由 Nginx/Apache/CDN。
- 应用层:减少 JSP 中的 Java 代码,使用 JSTL/EL;优化 SQL/索引/连接池;引入 Redis/Memcached/Ehcache 做缓存;对不需要会话的页面使用 <%@ page session=“false” %>。
- 变更与验证:每次调整 JVM/Tomcat/SQL/缓存 后,使用 ab/wrk 做基线压测与回归压测,观察 P50/P95/P99 与 错误率 的变化,确保优化有效且稳定。
以上优化与监控相辅相成,建议以指标驱动的方式逐步迭代。