为Java应用安装探针后,ARMS即可开始监控Java应用,您可以在实例监控页面了解应用的基础监控、实例GC和JVM内存等信息。
前提条件
ARMS应用监控面向已开通新版计费的用户提供全新的监控详情页面,新版计费详情,请参见产品计费(新版)。
对于未开通新版计费的用户,如需查看新版监控详情页面,可在应用列表页面单击切换新版。
已为应用安装探针,具体操作,请参见应用监控接入概述。
查看实例监控
登录ARMS控制台,在左侧导航栏选择 。
在应用列表页面顶部选择目标地域,然后单击目标应用名称。
说明语言列的图标含义如下:
:接入应用监控的Java应用。
:接入应用监控的Golang应用。
:接入应用监控的Python应用。
-:接入可观测链路 OpenTelemetry 版的应用。
在上方导航栏单击实例监控。
页面说明
实例监控页面会根据应用接入的信息自动适配展示大盘,并针对ECS环境和容器环境做区别展示。
在容器场景下,如果已经接入可观测监控 Prometheus 版,则优先以可观测监控 Prometheus 版数据作为容器信息的展示。容器环境接入可观测监控 Prometheus 版的操作,请参见容器可观测。
容器环境如果未接入可观测监控 Prometheus 版,需要确保应用监控探针版本在4.1.0或以上,对应数据展示容器的基础信息。应用监控探针说明,请参见探针(Java Agent)版本说明。
ECS环境
在快捷筛选区域(图示①),您可以按主机地址对图表、实例列表进行筛选。
在趋势图区域(图示②),您可以查看实例的基础监控、实例GC和JVM内存的时序曲线。
基础监控:应用在指定时间范围内CPU、内存和磁盘使用率趋势图。通过图标名称右侧的下拉框可以切换展示各使用率的平均值和最大值。
实例GC:应用在指定时间范围内Full GC和Young GC的趋势图。通过图表名称右侧的下拉框可以切换展示GC的次数和平均耗时。
JVM内存:应用在指定时间范围内堆内存已使用和最大值趋势图。通过图标名称右侧的下拉框可以切换展示非堆内存已使用和最大值趋势图。
说明ARMS应用监控采集的数据来自JMX,其中非堆内存所包含的内存区域比Java进程中实际的非堆内存区域少,因此可能会出现监控中堆内存+非堆内存总和与通过
top
命令看到的RES大小存在一定差值,相关细节请参见JVM监控内存详情说明。
单击图标,可以在弹出的对话框中查看该指标在某个时间段的统计情况或对比不同日期在同一时间段的统计情况,通过选择图标可以切换柱状图、趋势图进行展示。
在实例列表区域(图示③),您可以查看实例IP、CPU利用率、内存利用率、磁盘利用率、负载、Full GC次数、Young GC次数、堆内存使用量、非堆内存使用量、RED三指标(请求数、错误数、平均耗时)等信息。
在实例列表,您可以执行以下操作:
容器环境(Prometheus版)
在快捷筛选区域(图示①),您可以按集群和主机地址对图表、实例列表进行筛选。
在趋势图区域(图示②),您可以查看实例的基础监控、实例GC和JVM内存的时序曲线。
基础监控:应用在指定时间范围内CPU用量和内存用量趋势图。
实例GC:应用在指定时间范围内Full GC和Young GC的趋势图。通过图表名称右侧的下拉框可以切换展示GC的次数和平均耗时。
JVM内存:应用在指定时间范围内堆内存已使用和最大值趋势图。通过图标名称右侧的下拉框可以切换展示非堆内存已使用和最大值趋势图。
说明ARMS应用监控采集的数据来自JMX,其中非堆内存所包含的内存区域比Java进程中实际的非堆内存区域少,因此可能会出现监控中堆内存+非堆内存总和与通过
top
命令看到的RES大小存在一定差值,相关细节请参见JVM监控内存详情说明。
单击图标,可以在弹出的对话框中查看该指标在某个时间段的统计情况或对比不同日期在同一时间段的统计情况,通过选择图标可以切换柱状图、趋势图进行展示。
在实例列表区域(图示③),您可以查看实例IP、CPU用量、CPU请求、CPU限制、CPU利用率(未设置CPU限制时,此项展示为-)、内存用量、内存请求、内存限制、内存利用率(未设置内存限制时,此项展示为-)、磁盘用量、磁盘限制、磁盘利用率(未设置磁盘限制时,此项展示为-)、负载、Full GC 次数、Young GC 次数、堆内存使用量、非堆内存使用量、RED三指标(请求数、错误数、平均耗时)等。
在实例列表,您可以执行以下操作:
容器环境(ARMS自采集版)
在快捷筛选区域(图示①),您可以按主机地址对图表、实例列表进行筛选。
在趋势图区域(图示②),您可以查看实例的基础监控、实例GC和JVM内存的时序曲线。
基础监控:应用在指定时间范围内CPU用量和内存用量趋势图。
实例GC:应用在指定时间范围内Full GC和Young GC的趋势图。通过图表名称右侧的下拉框可以切换展示GC的次数和平均耗时。
JVM内存:应用在指定时间范围内堆内存已使用和最大值趋势图。通过图标名称右侧的下拉框可以切换展示非堆内存已使用和最大值趋势图。
说明ARMS应用监控采集的数据来自JMX,其中非堆内存所包含的内存区域比Java进程中实际的非堆内存区域少,因此可能会出现监控中堆内存+非堆内存总和与通过
top
命令看到的RES大小存在一定差值,相关细节请参见JVM监控内存详情说明。
单击图标,可以在弹出的对话框中查看该指标在某个时间段的统计情况或对比不同日期在同一时间段的统计情况,通过选择图标可以切换柱状图、趋势图进行展示。
在实例列表区域(图示③),您可以查看实例IP、CPU用量、内存用量、负载、Full GC 次数、Young GC 次数、堆内存使用量、非堆内存使用量、RED三指标(请求数、错误数、平均耗时)等。
在实例列表,您可以执行以下操作:
实例详情
概览
概览页签可以查看目标接口的请求数、错误数、平均耗时和慢调用信息。
JVM监控
JVM监控页签可以查看对应实例的GC、内存、线程、文件等信息。
池化监控
池化监控页签可以查看应用所使用的线程池或连接池的各项指标,包括核心线程数量、当前线程数量、最大线程数量、活跃线程数量、任务队列容量。
主机监控
主机监控页签可以查看CPU、内存、Disk(磁盘)、Load(负载)、网络流量和网络数据包的各项指标。
容器监控
容器环境(Prometheus版)
接入可观测监控 Prometheus 版的操作请参见Prometheus实例 for 容器服务。
容器监控页签可以查看容器视角的CPU、内存、Disk(磁盘)、Load(负载)、网络流量和网络数据包的各项指标。
容器环境(ARMS自采集版)
未接入可观测监控 Prometheus 版的情况下,需要确保ARMS探针版本在4.1.0或以上。探针版本说明请参见探针(Java Agent)版本说明。
容器监控页签可以查看容器视角的CPU、内存、网络流量的时序曲线。
调用链分析
调用链分析功能基于已存储的全量链路明细数据,通过自由组合筛选条件与聚合维度进行实时分析,可以满足不同场景的自定义诊断需求。更多信息,请参见调用链分析。
相关文档
应用监控详细的指标信息,请参见应用监控指标说明。
常见问题
应用级别的数据与单机的数据是什么关系
RED(请求数、错误数、延迟)指标:
请求数、慢调用次数、HTTP状态码次数:应用级别的数据是单机级别数据的汇总。
响应时间:应用级别的数据是单机级别数据的平均值。
JVM指标:
GC次数、GC耗时:应用级别的数据是单机级别数据的汇总。
堆内存数据、线程数:应用级别的数据是单机级别数据取最大值。
线程池/连接池指标
所有指标:应用级别的数据是单机级别数据的平均值。
系统指标
所有指标:应用级别的数据是单机级别数据取最大值。
SQL/NSQL调用:同RED指标,对于次数类指标,应用级别的数据是单机级别数据的汇总;对于其余指标,应用级别的数据是单机级别数据的平均值。
异常指标:应用级别的数据是单机级别数据的汇总。
不同实例之间流量不均匀
在3.x版本探针中,如果打开了内存优化开关,可能会导致部分指标统计丢失。该问题已在4.x版本探针中修复。
Undertow一次请求被统计成了两次
3.2.x版本之前探针埋点方法在使用DeferredResult场景下一次调用中会被执行两次。该问题已在3.2.x及以上版本中修复。
容器监控中CPU/内存配额与Pod实际设置不一致
请检查您的Pod中是否定义了多个Container,该指标会统计所有Container加起来的总配额。
系统指标部分缺失、不准或者CPU使用率展示为100%
4.x之前版本探针不支持Windows环境下系统指标采集,4.x及以后版本探针已经修复。
为什么应用刚启动会FullGC
一般是因为用户没有配置元空间大小,默认的元空间大小约为20 MB,应用在刚启动的时候可能会进行元空间的扩容从而触发FullGC,可通过-XX:MetaspaceSize
参数和XX:MaxMetaspaceSize
参数设置初始元空间和最大元空间大小。
VM Stack指标是如何计算的
该指标是通过线程数×1 MB得到的,其中1 MB是线程堆栈默认大小。如果通过-Xss
参数重新指定了线程堆栈大小,则该数据与实际情况会有差异。
JVM指标获取原理
ARMS展示的JVM指标均是通过标准的JDK接口获取的,对应接口如下:
内存相关指标:
ManagementFactory.getMemoryPoolMXBeans
java.lang.management.MemoryPoolMXBean#getUsage
GC相关指标:
ManagementFactory.getGarbageCollectorMXBeans
java.lang.management.GarbageCollectorMXBean#getCollectionCount
java.lang.management.GarbageCollectorMXBean#getCollectionTime
为什么JVM最大堆内存值为-1
-1代表未设置最大堆内存大小。
为什么JVM堆内存使用总量不等于设置的堆内存最大值
根据JVM内存分配机制,-Xms
参数指定初始堆内存分配,当空余堆内存不足后扩容,直到达到-Xmx
参数设置的最大值,总量与最大量不一致说明还没触发扩容,使用量是当前实际用量。
JVM GC的频率逐渐加快
可能是使用了JDK 8默认的GC算法ParallelGC,该算法默认开启了-XX:+UseAdaptiveSizePolicy
,其作用是自动调整堆的大小,包括新生代大小、SurvivorRatio等参数,为了满足GC的停顿时间,当YounGC比较频繁时,可能会动态缩小Survivor区的大小,这时候Survivor区的对象很容易晋升到Old区,导致Old区空间涨幅过快,从而触发Full GC的频率也加快。更多信息,请参见Java官方文档。
线程池、连接池监控没有数据
在自定义配置页面的高级设置区域确认是否已经开启线程池、连接池监控开关。
检查框架是否在支持的范围内,具体内容,请参见线程池和连接池监控。
HikariCP连接池获取的最大连接数与实际不符
3.2.x版本之前的探针获取最大连接数代码有误,3.2.x及以上版本已经修复。
池化监控指标展示数值是小数
探针每隔15s采集一次,因此一分钟会采集4个点的数据,控制台会根据采集信息展示一个时间段的平均值。例如:一分钟采集的4个数据点为0、 0、 1、 0,理论上平均值为0.25。
线程池/连接池明明被打满了,但为什么监控上没有体现出来
如果您的日志或其他记录中确实看到线程池/连接池被打满,但是ARMS控制台却看不到相关指标的增长,有可能是由于指标采样时间点与打满的时间点错开导致的。目前ARMS自动采集线程池/连接池状态指标的时间间隔为15s,发生在这个时间段内的瞬时冲高可能不会被采集到。
线程池监控最大线程数不符合预期或者最大线程数为21亿
ARMS最大线程池是直接调用线程池对象的获取最大线程数方法得到的,一般不会出错。如果不符合用户预期可能是用户设置的最大线程数未生效。
如果最大线程数为21亿一般是调度线程池,在调度线程池中,默认设置的最大线程数是Integer.MAX_VALUE
,如下图所示。