宏巍软件 许向

大家好,我是上海宏巍信息技术有限公司(简称:宏巍软件)的许向,宏巍软件成立于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),已累计为电商、移动互联网、广告传媒、在线游戏、教育医疗、金融证券、政企等行业的几十万用户提供了一站式的应用性能监控、管理及测试服务。

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

  1. 性能测试三十二:监控之Java线程监控

    线程的五种状态 * 新建:new * 运行:runnable * 等待:waitting(无限期等待),timed waitting(限期等待) * 阻塞:blocked * 结束:terminate ...

  2. java 线程监控

    线程的五种状态 * 新建:new * 运行:runnable * 等待:waitting(无限期等待),timed waitting(限期等待) * 阻塞:blocked * 结束:terminate ...

  3. Java线程监控及中断

    我们系统中经常有耗费时间长的任务,但客户端往往需要马上得到回应.这时我们就可以如下步骤实现: 1.客户端发起请求执行任务(选定条件,下载报表): 2.首先将任务ID及开始时间,起始状态记录到数据库表中 ...

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

    随着多核 CPU 的日益普及,越来越多的 Java 应用程序使用多线程并行计算来充分发挥整个系统的性能.多线程的使用也给应用程序开发人员带来了巨大的挑战,不正确地使用多线程可能造成线程死锁或资源竞争, ...

  5. 干货 | 教你如何监控 Java 线程池运行状态

    之前写过一篇 Java 线程池的使用介绍文章<线程池全面解析>,全面介绍了什么是线程池.线程池核心类.线程池工作流程.线程池分类.拒绝策略.及如何提交与关闭线程池等. 但在实际开发过程中, ...

  6. 干货:教你如何监控 Java 线程池运行状态

    之前写过一篇 Java 线程池的使用介绍文章<线程池全面解析>,全面介绍了什么是线程池.线程池核心类.线程池工作流程.线程池分类.拒绝策略.及如何提交与关闭线程池等. 但在实际开发过程中, ...

  7. Linux系统监控命令及如何定位到Java线程

    >>PID.TID的区分 uid是user id,即用户id,root用户的uid是0,0为最高权限,gid是group id,用户组id,使用 id 命令可以很简单的通过用户名查看UID ...

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

    这篇图文并茂,高端大气上档次,思维缜密的文章,一看就和我平时的风格不同.对了.这不是我写的,是我家高大英俊,写一手好代码,做一手好菜的男神老公的大作,曾发表于技术公号,经本人授权转载~~ 一.Java ...

  9. Linux系统监控命令及定位Java线程

    1.PID.TID的区分 uid是user id,即用户id,root用户的uid是0,0为最高权限,gid是group id,用户组id,使用 id 命令可以很简单的通过用户名查看UID.GID:~ ...

随机推荐

  1. C++设计模式-Memento备忘录模式

    Memento模式作用:在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态,这样以后就可将该对象恢复到原先保存的状态. UML图: Originator:负责创建一个备忘录Me ...

  2. Stopwatch 类

    Stopwatch 为计时器的实现. 主要属性方法 属性和方法 说明 static GetTimestamp() 如果Stopwatch使用高分辨率的性能计数器,则返回该计数器的当前值:如果Stopw ...

  3. mysqldump的使用

    mysqldump按导入:mysqldump -u用户名 -p密码 -h主机 数据库 < 路径eg:mysql -uroot -p1234 db1 < c:\a.txtmysqldump导 ...

  4. mongoDB在windows下安装与配置方案

    首先在官网下载mongoDB的安装包: https://www.mongodb.org/downloads 百度云盘下载:http://pan.baidu.com/s/1slUSGYp (安装版 wi ...

  5. mysql优化笔记

    query_cache_size 查询缓存 query_cache_type缓存是否打开 OFF/ON read_buffer_size读缓存SET GLOBAL query_cache_size=1 ...

  6. 配置Struts.xml DTD文件报错

    报错信息为: The content of element type "struts" must match "((package|include|bean|  cons ...

  7. drawing

    /* 程序名:drawing..c 功能:展示OpenCV的图像绘制功能 */ #include "cv.h" #include "highgui.h" #in ...

  8. xml---sax操作

    <?xml version="1.0" encoding="UTF-8"?> <书架> <书> <书名>书名1& ...

  9. c++ stl容器set成员函数介绍及set集合插入,遍历等用法举例

    c++ stl集合set介绍 c++ stl集合(Set)是一种包含已排序对象的关联容器.set/multiset会根据待定的排序准则,自动将元素排序.两者不同在于前者不允许元素重复,而后者允许. 1 ...

  10. PHP大文件存储示例,各种文件分割和合并(二进制分割与合并)

    最近要对视频进行上传,由于涉及到的视频非常的大,因此采用的是分片上传的格式,下面是一个简单的例子: split.php <?php $i = 0; //分割的块编号 $fp = fopen(&q ...