再谈JVM监控

      之前写过一篇用容器技术快速构建jvm监控服务的文章,那篇侧重讲的是实现,说的是“怎么做”的问题。这篇会去探讨“为什么”,算是对前一篇的补充。

     什么是监控

      软件技术虽然层出不穷,但本质上大同小异。

      在讲JVM监控之前,我们可以先类比一下现实生活经常可以看到的视频监控。视频监控一般由摄像头,网络传输线,视频服务器,监控终端这几个组件构成。摄像头用来采集视频数据(有些摄像头自带转码,有些会有另外的转码器),网络传输线用来传输数据,视频服务器用来处理和存储数据,监控终端用来展示视频图像。在这里你可以看到,监控的整个工作流,其实就是在跟数据打交道。只不过各个环节打交道的方式不同。JVM监控也是如此,它的整个工作流也是围绕数据进行。

    JMX

      监控的第一步也是最重要的一步就是采集数据。假如现在让你采集一个程序的运行时信息,你会在程序里预先写好数据采集的代码,常见的场景如打日志。我们可以定义把日志打到文件里,标准输出里,网络协议里等等。jdk在的java.lang.management包中实现了采集JVM状态数据的功能。java代码很简单,真正实现数据采集功能的是底层的native方法。这里不做过多讨论。但是问题来了,并不是每个人在任何时候都需要监控JVM的状态。也并不是每个JVM都需要被监控。所以我们需要一种动态机制,能够让我们选择用不用,在什么时候用,以何种频率用。在我们自己写程序的时候,通常使用配置文件或者环境变量等方式来达到这种目的。jdk则提供JMX来解决动态管理的问题。

       JMX技术的实现分为三层架构。第一层叫Instrumentation,用于管理使用JMX的资源。JMX定义:如果一个java类是使用JMX技术的,那么这个类的名字必须要以MBean或者MXBean结尾。所以第一层的工作就是发现MBean,并把它们注册到第二层,JMX Agent。JMX Agent可以控制注册在其上的资源,也就是一些java类。并使得外部的管理程序可以使用这些资源。第三层叫Remote management,可以理解为用于帮助MBeanServer与外部管理程序连接的组件。如果要开启JMX的功能,只需要在启动时设置com.sun.management.jmxremote.porty以及相关的参数即可。下面这段代码简单演示了如何获取一个JVM的内存使用态:

       在上面的例子中,我们看到了某一时间点上的JVM内存使用情况。这是一种监控吗?在特殊的情况下是的。有时候需要获取某一时间点的JVM状态。比如说在系统发生宕机前,hook在shutdown signal的JVM监控,可以帮助分析系统为什么宕机。但在通常情况下,我们所说的监控,是对事物状态的连续观测。我们可以把上面的代码定义成一个job,用quartz这样的框架去定时执行。但这样费时费力。更好的选择是用那些已经比较成熟的框架,谷歌的jmxTrans就是其中之一。有兴趣的同学可以去了解一下。

     数据处理

      实现了JVM状态数据的持续采集之后该怎么做呢。一种选择是我们可以把数据稍加处理,在前台页面展示成dashbord,就像jconsole那样。但如果只是做到像jconsole那样,是不能被称为监控服务的。一旦前端展示页面的进程退出,历史的JVM状态将无法追溯。而我们经常需要追溯历史数据。所以监控数据需要被存储,监控服务才能更稳定。我们依旧可以用自己的方法把数据直接存储,然后再抽取存储的数据,稍加处理传给前台的展示页面。我们可以用es,mongoDB甚至是mysql等来完成这样的工作。只要你不嫌麻烦,心中所念:所谓监控无非就是处理数据,你一定能成功。但市面上已经有很多工具可以很好地完成这样的工作,而且完成的还很好,很方便。你大可不必再费心费力自己实现一套。我们只需要稍加利用这些框架就好。在我搭建JVM监控的时候,我用的是graphite。这是一款比较易用的工具,外部的易用一定意味着其内部的精心设计与大量工作。有兴趣的同学可以自行查阅。

      数据展示

        接下来就是数据展示的问题了,其实graphite本身是有数据展示的web服务的。它的优点是,图表都是自动生成,无需配置。它的缺点是丑,不清晰,看着累。所以可以把graphite作为数据源,在grafana中展示。grafana可能大家都听说过,但很多人对它有误解。以为可以单独用它来完成监控,其实不是的。它主要还是被用作监控报表,报表的原始数据来自配置的数据源。

      总结:

        回过头来看,要完成JVM监控其实还是很容易的。如果不出什么幺蛾子,搭建的过程无非就是安装和配置的过程。如果你用容器来完成,那简直就跟搭积木一样简单了。但我要说的是,幺蛾子肯定是会出现的,只是时间的问题。要想搭出健壮的监控系统,一定需要勤学苦练。仅仅知道本文说的“为什么”问题也许还不够。如果有机会,下次再来深入探讨下“是什么”的问题。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容