JVM监控中的process_cpu_useage监控项分析

公众号:yunops

一、监控架构说明

  Spring Boot 自带监控功能 Actuator,可在应用服务中提供众多 Web 接口(配置接口、度量接口和其它接口共计 13 个),通过这些接口实现对程序内部运行情况监控,比如监控状况、Bean 加载情况、环境变量、日志信息、线程信息等。

二、具体实现:

  1. 基于 Spring Boot2.0+框架项目中对 Actuator 进行依赖引用(不同打包工具,如 Maven 或 Gradle 配置略有区别),应用启动后提供度量接口(endpoint):/actuator/prometheus
  2. prometheus 中配置基于注册中心(eureka)的 job 自动发现对个应用的度量接口暴露的监控指标进行收集;
  3. 集成 Grafana,对 JVM 的内存分配、GC 情况进行动态图形化展示(如编号为 4701 的 dashboard)。

三、应用过程中的问题

1. 现象描述:

  在落地过程中发现一个比较奇怪的现象:一个 30 个节点的服务(非容器,直接运行在阿里云 ECS 主机上)版本迭代后,个别节点的 CPU 使用率一项中的 process_cpu_usage(字面意思:进程 CPU 使用情况,官方注释:The “recent cpu usage” for the Java Virtual Machine process)指标异常波动(80%-40%反复横跳)的同时,宿主机的系统整体 CPU 使用率却稳的一匹(稳定 10%),环境说明如下:

2. 知识储备:

3. 分析:

  一开始就容易陷入了误区:process_cpu_usage 和 system_cpu_usage 放在一起,很容易让人想到这俩指标分别是进程的用户态 cpu 使用统计(进程性能相关)和进程内核态 cpu 使用统计(内核线程或者系统调用性能相关);经过翻文档确认这种理解有误;初步确认:process_cpu_usage 是 java 应用进程最近的 cpu 使用率指标;system_cpu_usage 是 ECS 主机整体 cpu 使用率指标;那么问题就来了:

4. 结论:

仍未找出监控系统中 process_cpu_usage 指标达到 100% 时 system_cpu_usage 数值为 20% 现象的根本原因,通过重启解决;

因为在应用服务正常运行期间各指标监控曲线应该是平滑的,在没有人为操作、业务流量没有变化的前提下监控曲线出现陡增陡降的现象,将其判定为异常状况,稳妥期间进行进程重启,重启后监控曲线也的确恢复平滑;表示异常状况恢复,但是原因没有定位到;下次再发生的时候,情况允许的话保留一下现场再次排查,希望能找到蛛丝马迹,各位同学有好的想法或者提议也希望不吝赐教;