温馨提示×

如何监控CentOS上的Java应用性能

小樊
45
2025-11-27 17:54:04
栏目: 编程语言

监控思路与分层

  • 建议从三层入手:系统层(CPU、内存、磁盘、网络)、JVM层(堆与非堆、GC、线程、类加载、JIT)、应用层(HTTP 延迟、吞吐、错误率、数据库/缓存调用)。
  • CentOS 上,系统层用命令行与轻量工具快速排查;JVM层用 JDK 自带工具 深入分析;应用与业务指标用 Prometheus + JMX Exporter + GrafanaSkyWalking/APM 做持续观测与告警。

快速排查命令与示例

  • 获取进程 PID
    • 使用 jps -vps -ef | grep java 定位目标 PID
  • 资源占用
    • 实时查看进程:top -p ;系统综合资源:dstat -ta 16;或 nmon 交互式查看 CPU/内存/磁盘/网络
  • JVM 关键指标
    • 堆与 GC 概览:jstat -gcutil <间隔秒> <次数>(关注 YGC/YGCT、FGC/FGCT、GCT 与各区使用率)。
    • 线程与锁:jstack (定位 死锁/阻塞/长时间运行线程)。
    • 内存快照与直方图:jmap -dump:format=b,file=heap.hprof jmap -histo (排查内存泄漏线索)。
    • JVM 参数与运行时配置:jinfo
  • 远程可视化
    • JConsoleVisualVM 连接本地/远程 JVM,查看 内存、线程、类、CPUMBeans

JMX 远程监控与采集

  • 启用 JMX(示例为本地/测试环境,生产请开启认证与 SSL)
    • 启动参数:
      • java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -jar yourapp.jar
    • 远程连接串示例:service:jmx:rmi:///jndi/rmi://:9010/jmxrmi
  • 采集与可视化
    • 使用 JMX ExporterJVM MBeans 暴露为 Prometheus 指标,再由 Prometheus 拉取并存储,最后用 Grafana 展示面板(适合容器化与集群环境)。
    • 也可直接用 JConsole/VisualVM 通过 JMX 连接查看 内存、线程、类加载、GC 等。

持续观测与告警方案

  • 指标采集与展示
    • Prometheus + JMX Exporter + Grafana:覆盖 JVM 内存/GC/线程 与自定义业务指标,配置阈值告警(如 FGC 频繁、Full GC 时间过长、线程数异常)。
    • SkyWalking:面向 分布式追踪服务性能,可观测 调用链、响应时间、错误率,并与 JVM 指标联动分析。
    • Micrometer + Spring Boot Actuator:在应用内埋点,轻松对接 Prometheus/Grafana,输出 HTTP、JDBC、缓存 等应用层指标。
    • 商业 APM(可选):如 New Relic / AppDynamics,快速获得 事务追踪、慢查询、错误分析 等能力。

关键指标与告警阈值示例

维度 关键指标 建议阈值或动作
系统 CPU 使用率 持续 > 80% 触发排查(热点方法、GC 压力、外部依赖)
系统 可用内存 剩余 < 10% 或频繁换页,检查堆/非堆与缓存占用
系统 磁盘 I/O await/svctm 明显升高,排查日志/堆转储/数据库写入
系统 网络 丢包/重传率高,排查网卡、带宽与应用重试
JVM 堆 Heap 使用率 持续 > 80% 或频繁 Full GC,考虑增大堆或优化对象生命周期
JVM GC YGC/FGC 次数与耗时 FGC 次数增加或 FGCT 明显变长,分析老年代占用与引用泄漏
JVM 线程 线程总数/阻塞/死锁 线程数突增或 BLOCKED/DEADLOCK,用 jstack 定位热点与锁竞争
JVM 类 加载/卸载 持续增长不回落,警惕 ClassLoader/热部署 泄漏
应用 HTTP 延迟/P95/P99 超过 SLA 阈值触发告警,联动 trace 定位瓶颈
应用 错误率 5xx/异常率升高,结合日志与 调用链 快速定位根因

0