干货|宏巍软件之Java线程监控之旅

宏巍软件 许向

大家好,我是上海宏巍信息技术有限公司(简称:宏巍软件)的许向,宏巍软件成立于2005年,是一家以电商ERP软件开发为主的高新技术科技型软件公司,致力于为大型网商和电子商务企业提供专业、全面、量身订制的企业ERP管理软件和应用解决方案。

宏巍电商ERP软件是在阿里体系内使用他们的SLB,然后在ECS上用haproxy JBOSS(多进程)做的集群,ERP端和接口系统都是使用Java语言实现的。随着近年来电商业务量的爆发式增长,Java在性能上的问题逐渐突出,ERP端有时候会无故的卡顿,接口系统跑着跑着没了,或者进程出现卡死情况。

宏巍电商ERP软件架构

我们尝试过很多方法来进行Java线程状态的监控,比如开始时使用jstat、jps等工具来读取JVM的状态,同时也尝试用过Zabbix的Java proxy,但都不能满足电商ERP产品性能监控需求。后来通过脚本来调用这些工具读取状态后,通过API回写给Zabbix来记录与报警,但仍然不能完全解决Java线程卡死的问题,因为这些数据只有常态的内存状态,GC回收状态,线程到底在干什么,运维压根是不知道的。

于是我们尝试用JProfile来对具体的情况进行分析,但是JProfile非常耗资源,没法在生产环境上进行调试,这就导致了很多系统没有数据通过就无法调试,而这种情况持续了很长一段时间。最后我们的解决办法就是写一个监控的爬虫,跑在每台机器上,发现钩子爬不到了就触发重启Java进程,并且进行邮件告警。

后来遇到了云智慧应用性能管理产品透视宝http://www.toushibao.com 的工程师 ,给我们定制了基于电商ERP任务系统的Java线程APM监控,与原有定时任务所使用的Java Quartz实现无缝对接。

在JBoss启动过程中插入透视宝的Agent,并由业务启动脚本通过配置文件来判断业务是不是要启动监控,当监控启动以后,我们在透视宝的Dashboard里就可以看到每个Java进程的详细运行情况,从主进程到其派生出来的子进程,能准确了解到底哪个环节的哪些方法慢,什么方法卡死了。

 

 

透视宝实现了对运行时代码、SQL执行、API调用过程的性能数据采集与分析,深入到代码层面定位性能瓶颈,分析性能下降的原因,帮助技术和运维人员从大量的业务请求中抓取及分析真实用户操作背后的代码执行逻辑关系与状态如执行时间最长的方法、慢查询。

与传统  Agent  安装与配置模式不同,透视宝提供的Smart  Agent实现了真正一键安装,针对不同操作系统版本及各种服务,用户无需面对各种复杂的下载和参数配置,Smart  Agent会自动发现本机所有的服务、应用及运行时代码环境,用户确认后系统会自动安装对应版本的监控插件,整个过程全自动化实现,用户不需要进行任何手动配置操作。针对复杂系统的维护与升级,透视宝同样提供方便的更新解决方案,可对Smart Agent的健康状态进行实时监测,当系统环境发生变化时,无需重新安装与部署,可有效降低集群环境中系统的总体维护成本。

QA:

问:透视宝的Agent插入简单吗?

答:

 

 

透视宝Agent插入非常简单,只要是支持的Java版本,无需手动配置和下载就能自动匹配对应的探针文件,插入过程完全自动化。

当然你可以根据需要决定是否插入探针,这是我们在脚本里面做的开关,供参考。

问:你的爬虫爬取哪些内容?

答:

 

我们的爬虫会根据配置文件,爬自己的健康页面,每台机器上的集群配置文件是由我们的运维系统创建并分发下去的,同时每台机器上都会通过slat来同步脚本。

问:怎么实现Java Quartz定时的?刚看你说的爬的钩子都是健康页面,定时任务也算吗?

答:定时任务监控一直是我们很头疼的一个问题,我们用了一个妥协的办法,把Quartz跑到JBoss的serverlet里面去,在没有透视宝之前我只能知道进程没了,或者进程僵死了,如果Quartz的调度任务内部代码出现问题,我们是不知道的,因为这个时候返回都是正常的,我们只能通过转化任务的池来比对判定。

问:利用python爬取健康页面,有没有具体策略?比如如何触发报警,什么时候报警?

答:页面钩子,脚本通过Cron或者跑在后台,脚本都能支持。

问:报警后有没有进程恢复策略?

答:简单粗暴,干掉重启。因为前端有LB,当掉一台问题不大,我们有另外一套业务在测试TBSchedule,Taobao开源的一套任务系统:https://github.com/taobao/TBSchedule,后来发现换了这个任务还是卡死,为了深挖代码问题,就强推了一把透视宝。运维现在用的是Tornado Flower Celery,用的很开心也很稳定。我觉得关键不在于用什么框架,而是在于代码性能到底怎么样,所以要发现代码问题,APM一定要上。

问:服务器上jvm堆外内存是怎么监控的?

答:目前堆外内存并没有监控,因为我们运维人少事情多,简单粗暴能处理掉问题就行了。

问:如果服务器jvm堆内存很稳定,可是内存一点点上涨的话,这个会不会有问题呢?

答:这个要结合业务来看,如果与业务增长曲线是同步的,也没有太多问题。如果没有业务增长,内存却还是在增加,然后full gc ,就要考虑代码上有内存泄露了。一般说linux内存慢慢被占用很正常, full gc的话也不是很频繁。很缓慢的增长,运行几天都可能不会发生,如果运行太长时间 jvm 突然间来一次full gc的话,那应用就会突然卡住。

问:在服务集群部署的情况下,会不会运行一段时间就自动重启应用,释放jvm占用的内存?

答: 不会,jvm本身会回收,只要找到自己业务合适的内存配置就可以。

问:你们集群会不会定时重启部分应用呢?

答:我们集群并没有定期重启,但是我们发布很频繁,一周有2个发布窗口,等于一周重启了2次。

云智慧是业务运维解决方案服务商,旗下产品监控宝(www.jiankongbao.com)、透视宝(www.toushibao.com)、压测宝(www.yacebao.com),已累计为电商、移动互联网、广告传媒、在线游戏、教育医疗、金融证券、政企等行业的几十万用户提供了一站式的应用性能监控、管理及测试服务。

时间: 2024-10-09 21:44:53

干货|宏巍软件之Java线程监控之旅的相关文章

java 线程监控

线程的五种状态 * 新建:new * 运行:runnable * 等待:waitting(无限期等待),timed waitting(限期等待) * 阻塞:blocked * 结束:terminated 线程转换关系 线程的两种监控方法 一,jvisualvm,图形界面的方式 监控之前先对jvm加监控参数,在tomcat的bin目录下,catalina.sh文件中,添加: JAVA_OPTS="-Dcom.sun.management.jmxremote.port=10086 -Dcom.sun

Java线程监控

第一步,找出Java进程PID: ps -ef | grep java | grep -v “grep” | awk ‘{print $2}’ 第二步,找出最耗CPU的线程: ps -mp pid -o THREAD,tid,time | sort -rn -k9 第三步,将tid转换为16进制: printf “%x\n” tid 第四步,dump出JVM的堆栈信息: jstack pid jstack中的nid对应于前面的16进制tid,由此找到最耗cpu的线程代码. 使用top命令获取线程

基于 JVMTI 实现 Java 线程的监控(转)

随着多核 CPU 的日益普及,越来越多的 Java 应用程序使用多线程并行计算来充分发挥整个系统的性能.多线程的使用也给应用程序开发人员带来了巨大的挑战,不正确地使用多线程可能造成线程死锁或资源竞争,导致系统瘫痪.因此,需要一种运行时线程监控工具来帮助开发人员诊断和跟踪 Java 线程状态的切换.JDK 1.5 及其后续版本提供了监控虚拟机运行状态的接口 JVMTI.本文深入分析了 JVM 中的 Java 线程模型,设计了用于监控线程状态切换的模型,并基于 JVMTI 实现了对 Java 线程切

教你如何监控 Java 线程池运行状态

之前写过一篇 Java 线程池的使用介绍文章<线程池全面解析>,全面介绍了什么是线程池.线程池核心类.线程池工作流程.线程池分类.拒绝策略.及如何提交与关闭线程池等. 但在实际开发过程中,在线程池使用过程中可能会遇到各方面的故障,如线程池阻塞,无法提交新任务等. 如果你想监控某一个线程池的执行状态,线程池执行类 ThreadPoolExecutor 也给出了相关的 API, 能实时获取线程池的当前活动线程数.正在排队中的线程数.已经执行完成的线程数.总线程数等. 总线程数 = 排队线程数 +

干货 | 云智慧透视宝Java代码性能监控实现原理

这篇图文并茂,高端大气上档次,思维缜密的文章,一看就和我平时的风格不同.对了.这不是我写的,是我家高大英俊,写一手好代码,炒一手好菜的男神架构师老公的大作,曾发表于技术公号,经本人授权转载,如有技术问题,我代为请他本人解答~~ 一.Java平台体系及应用场景 从1995年Sun Microsystems公司正式推出Java,到2006年时Sun公司将其开源,迄今为止已经有了20年的历史.Java本身已不仅仅只是一门面向对象的编程语言,而是由一系列计算机软件和规范形成的技术体系,这个技术体系提供了

Linux下Java线程详细监控和其dump的分析使用----分析Java性能瓶颈

这里对linux下.sun(oracle) JDK的线程资源占用问题的查找步骤做一个小结: linux环境下,当发现java进程占用CPU资源很高,且又要想更进一步查出哪一个java线程占用了CPU资源时,按照以下步骤进行查找: (一):通过[top -p 12377 -H] 查看java进程的有哪些线程的运行情况:       和通过[jstack 12377 > stack.log]生成Java线程的dump详细信息: 先用top命令找出占用资源厉害的java进程id,如图:# top 如上

java线程池的自带监控,线程池返回值的控制

当使用java线程池的时候,返回值类型用future<T> 来接收,比如: Future<String> future = fixedThreadPool.submit(new Thread());返回的结果必须由线程执行完毕后才会返回,我们可以利用这一点进行线程堵塞,监控线程的结束时间. package com.test; import java.util.ArrayList; import java.util.List; import java.util.concurrent.

java线程池监控

原因 最近在完善公司的基础发布平台的时候,使用到了一线程去做一些异步的事情,在开发环境和测试环境验证没有任何问题,但是在程序在生产运行一段时间后,发现没有得到自己想要的结果,为此开始了漫长的排查bug的之路,因为用到了一些线程,但是实际又没有对这些线程足够的监控,所以在排查问题的时候也是历经艰难险阻: 原始代码 protected ScheduledExecutorService executorService = Executors.newScheduledThreadPool(2); /**

Java线程经典面试题

53道Java线程面试题 下面是Java线程相关的热门面试题,你可以用它来好好准备面试. 1) 什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位.程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速.比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒.Java在语言层面对多线程提供了卓越的支持,它也是一个很好的卖点. 2) 线程和进程有什么区别? 线程是进程的子集,一个进程可以有很多线程,每条线程并