资讯专栏INFORMATION COLUMN

基于jmx 实现异常指标监测实践

IT那活儿 / 2472人阅读
基于jmx 实现异常指标监测实践

点击上方“IT那活儿”公众号,关注后了解更多内容,不管IT什么活儿,干就完了!!! 


  

我们在日常运维工作,往往需要对基于java开发的组件的重要性能指标进行实时监测与告警,而实现监测手段用的最多的还是基于jmx(Java Management Extensions)来实现。

JMX是管理Java的一种扩展,用于定义了应用程序以及网络管理和监控的体系结构、设计模式、应用程序接口以及服务,通过jmx这种机制可以方便的管理、监控正在运行中的Java程序,常用于管理线程,内存,日志Level,服务重启,系统环境等。

常用部署使用jmx 监测主要是分为如下几种方式:

1. jvm部署代理agent(主动方式):  

JVM 启动时指定参数,通过 javaagent 的形式运行监测程序依赖包,因为监测依赖包跟jvm本身是部署在一起,是通过在进程内读取jvm运行时的性能数据,实时将metrics 性能数据暴露出来,本质上在本机上利用jmx协议监测实现,如jmx_exporter/apm(pinpoint/skywalking) /自研agent程序等

2. 开启jmx远程访问(被动方式):

JVM 启动时指定参数,暴露 JMX 的 RMI 接口,第三方工具调用 RMI 获取 JVM 运行时状态数据,常用jconsole/jvisualvm/zabbix等

3. 在自己程序里面自行实现jmx 自带MXBean管理接口,读取性能指标信息。 




jmx监测实例


 

不同客户环境不一样,所采取方式都有所不同,本文以tomcat 8.5.x+jdk1.8监测为例,实践利用开启jmx远程访问的方式, 获取核心指标,检验核心指标告警可行性。

1. 核心指标

梳理影响业务性能的部份关键指标,用于规则告警,实时发现应用的性能问题。

2. 测试程序

编写异常测试场景程序,检验利用jmx方式是否能扑获到异常。

3. 开启jmx远程访问

打开tomcat/bin/catalina.sh文件,在现有的shell 文件里面的shift与touch "$CATALINA_OUT"的中间,新增以下内容:

 

重启tomcat 服务,利用ps -ef|grep tomcat 检查参数是否生效。

4. 异常场景检测

1)下载cmdline-jmxclient-0.10.3.jar工具,用于抓取jmx的mbean信息。

http://crawler.archive.org/cmdline-jmxclient/cmdline-jmxclient-0.10.3.jar

2)使用方法

java -jar cmdline-jmxclient-0.10.3.jar --help

Usage: java -jar cmdline-jmxclient.jar USER:PASS HOST:PORT [BEAN] [COMMAND]

说明:如果jmx未开启用户名与密码访问,需要用- 进行替代,而帮助里面。

3)查看服务器所有Mbeans的信息

java -jar cmdline-jmxclient-0.10.3.jar - 127.0.0.1:10990

mbeans有很多,我们通常重点关注如下bean即可。

4)场景一:  线程池满  

告警规则:ThreadCount=maxThreads 代表线程池已满。

5)场景二:堆内存使用率

告警规则:

  • l堆内存使用/堆内存最大分配>0.95 需要告警;

  • l非堆内存使用/非堆内存最大分配>0.95 需要告警;

  • l元空间使用/元空间最大分配>0.95 需要告警。

6)场景三:死锁线程

运行造成死锁程序案例,造成多个线程之间互相等待,形成了死锁现象。

注意:cmdline-jmxclient提供操作获取线程信息的方法,按提供的命令参数,在实践过程老是报错,网上及官网也没有搜索到解决方案(https://webarchive.jira.com/browse/HER-1630),目前只能通过编写代码来实现。

long[] ids = threadMXBean.getAllThreadIds();

for (long id : ids) {

   ThreadInfo threadInfo = threadMXBean.getThreadInfo(id);

   System.out.println(threadInfo.getBlockedCount());

   System.out.println(threadInfo.getBlockedTime());

   System.out.println(threadInfo.getWaitedCount());

   System.out.println(threadInfo.getWaitedTime());

}

死锁线程数量:3

  • 线程:Thread-40正在等待,线程:Thread-8持有的锁;

  • 线程:Thread-8正在等待,线程:Thread-7持有的锁;

  • 线程:Thread-7正在等待,线程:Thread-8持有的锁。

告警规则:

  • l死锁线程数量>0 需要告警。

7)场景四:内存溢出

将tomcat jvm 堆大小调小并且设置内存溢出时自动生成headdump文件,设置成 -Xms10m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError ,运行造批量生成对像测试程序。

存在现象:

  • ljmx  没有一个专门指标来说明如获取是否产生了oom 文件;

  • l会存在进程oom 情况下但堆内存使用比率并没有占满的现象所以内存溢出不能完全依赖这个条件。

告警规则:

  • l扫描日志关键字OutOfMemoryError  存在就告警;

  • l当监测到full gc 次数在短时间内有明显增长时需要告警。

8)jndi连接池满场景

告警规则:

  • ljndi活动连接数=jndi最大连接数需告警。

9)其它场景

告警规则:

  • ltomcat进程CPU使用率需要根据业务实际情况配置对应告警阀值;

  • l打开文件数句柄/最大打开文件数句柄>0.95 需要告警。

小结:利用jmx 监测并不能完全解决日常监测场景所面对的问题,需结合日志关键字提升异常监测的准确性。


END



本文作者:暨景书

本文来源:IT那活儿(上海新炬王翦团队)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129475.html

相关文章

  • 基于阿里云HiTSDB搭建工业物联网平台实践

    摘要:摘要基于阿里云全面的物联网云计算与大数据技术搭建云端的企业能源管理物联网平台实现能耗数据采集统计分析平衡调度节能优化等全面的能源管控协同平台。平台架构边缘计算采集的工业数据上传到阿里云的物联网套件,中间经过了协议的可靠传输。 摘要: 基于阿里云全面的物联网、云计算与大数据技术搭建云端的企业能源管理物联网平台实现能耗数据采集、统计分析、平衡调度、节能优化等全面的能源管控协同平台。是企业生...

    beanlam 评论0 收藏0
  • 你应当知道的7个Java工具

    摘要:如果应用发生了内存泄漏问题,就会进行检测生成报告,并且提供切实可行的方案去掉这个问题。主要特性实时的内存泄漏检测和告警一份包含时间,内存大小,速度以及泄漏事件的重要级别的报告。 在这篇文章中我们决定收集制作一个关于这类工具的简略名单,他们中的大多数工具只是最近推出的。其中一些工具是为Java定制的,但也有一些是支持其他语言。但对于Java项目而言,他们都是非常好的,并且拥有同一个愿景:...

    Pandaaa 评论0 收藏0
  • 使用Prometheus+Alertmanager告警JVM异常情况

    摘要:,负责抓取存储指标信息,并提供查询功能,本文重点使用它的告警功能。,负责将告警通知给相关人员。配置的告警触发规则使用超过最大上限的机时间超过秒分钟分钟时间在最近分钟里超过配置连接,配置。 原文地址 在前一篇文章中提到了如何使用Prometheus+Grafana来监控JVM。本文介绍如何使用Prometheus+Alertmanager来对JVM的某些情况作出告警。 本文所提到的脚本可...

    lushan 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<