Zabbix使用自动发现功能监控服务器各JVM进程状态

前言
==========
为什么需要做服务器jvm自动发现的监控呢?这个事情主要有两点原因:
    1.zabbix默认监控jvm状态是使用jmx中转进行监控的,监控效率比较低下
    2.zabbix使用jmx监控jvm的时候由于一个主机上的键值不能重复,也就导致了一台主机上只能监控一个jvm实例
    以上两点原因导致zabbix通过jmx监控jvm的实现不是很理想,加上最近老大要求收集服务器上面跑的所有Java应用的信息,于是自己琢磨了下,还是自己动手,丰衣足食。利用了周末的时间,通过使用shell脚本+java工具jstat+zabbix实现监控主机上多jvm实例的功能。
第一章:概念的理解
 首先,既然要监控jvm状态,那就必须要了解jvm里面的信息,楼主通过搜索资料加自动脑补,把网上的资料取其精华,去其糟粕,整理了一下。JVM中的内存分类分为堆内存和非堆内存,堆内存是给实际应用使用的,非堆内存是给jvm容器使用的。我们主要关心的是堆内存这块。在堆内存里面,给内存分为如下几块:
 1.Young代(年轻代)
 2.Old代(老年代)
 3.Perm代(永久代)(关于这一点,在JDK7和JDK8中情况不一样,将在后面进行分析)
 其中,年轻代里面又分成了三块,如下:
 1.Eden代(伊甸园代)
 2.survivor0代(0号幸存区)
 3.survivor1代(1号幸存区)
 至于更详细的关于JVM堆内存的信息,各位可以自行百度或者google,我这里就不赘述了,毕竟我也是个半桶水,自己找了点资料外加脑补到的一些东西,不敢在关公门前耍大刀了。
 当然,还得科普一个东西,那就是GC,所谓的GC就是JVM在运行的时候会有一个垃圾回收机制,这个垃圾回收机制是什么情况呢?就是在程序运行的时候会产生很多已经不使用的空间,但还是被占用了的情况,这样会造成很多不必要的浪费,于是JVM就有一个垃圾回收机制,针对程序中已经不使用的内存资源,会进行回收释放,这个过程就叫做GC。当然,关于GC还有很多内容我这里也没有详述,理由同上条。各位看官只需要知道GC是JVM监控里面的一个很重要的参数就行了。
 第一章,关于JVM中概念的理解结束了,预知后事如何,请听下回分解。
第二章:JAVA工具的选用
 java工具有很多,关于jvm监控的工具主要有如下几个:
 + jstat
 + jmap
 + jstack
 其中jmap --heap pid可以抓出挺多的关于某个jvm的运行参数,但是老大提醒我最好不要使用jmap进行jvm监控,具体没有说明原因。于是本着打破砂锅问到底的精神,我又去搜了一把,发现了如下内容:
 jmap最主要的危险操作是下面这三种:
1. jmap -dump
这个命令执行,JVM会将整个heap的信息dump写入到一个文件,heap如果比较大的话,就会导致这个过程比较耗时,并且执行的过程中为了保证dump的信息是可靠的,所以会暂停应用。
2. jmap -permstat
这个命令执行,JVM会去统计perm区的状况,这整个过程也会比较的耗时,并且同样也会暂停应用。
3. jmap -histo:live
这个命令执行,JVM会先触发gc,然后再统计信息。
上面的这三个操作都将对应用的执行产生影响,所以建议如果不是很有必要的话,不要去执行。
所以,从上面三点来看,jmap命令对jvm状态影响还是比较大的,而且执行jmap --heap的时间也比较长,效率较低,予以排除。
接下来是jstack,这个命令可以深入到JVM里面对JVM运行问题进行排查,据说还可以统计JVM里面的线程数量。但是这个命令执行效率也比较低,被排除掉了。
于是剩下的只有一个jstat命令了。下面来详细的讲解该命令的使用了,咳咳,各位快点打起点精神来,这可是重头戏来了。
首先,列出jstat命令的一些使用案例吧:
============================================
1.jstat -gc pid
            可以显示gc的信息,查看gc的次数,及时间。
            其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。
S0C    S1C    S0U    S1U      EC      EU        OC        OU      PC    PU    YGC    YGCT    FGC    FGCT    GCT   
9792.0 10048.0  0.0  5143.2 242048.0 220095.4  323200.0  211509.3  186368.0 114451.6    317    4.850  4      0.971    5.821
 S0C    S1C    S0U    S1U      EC      EU        OC        OU      MC    MU    CCSC  CCSU  YGC    YGCT    FGC    FGCT    GCT   
1024.0 1024.0  0.0  320.0  11776.0  11604.6  260608.0  149759.6  39344.0 38142.6 4528.0 4303.1  5473  24.010  2      0.128  24.138
2.jstat -gccapacity pid
            可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小,
            如 PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,
            PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。
            其他的可以根据这个类推, OC是old内纯的占用量。
 NGCMN    NGCMX    NGC    S0C  S1C      EC      OGCMN      OGCMX      OGC        OC      PGCMN    PGCMX    PGC      PC    YGC    FGC 
 87360.0 262144.0 262144.0 9792.0 10048.0 242048.0  174784.0  786432.0  323200.0  323200.0 131072.0 262144.0 186368.0 186368.0    317    4
 NGCMN    NGCMX    NGC    S0C  S1C      EC      OGCMN      OGCMX      OGC        OC      MCMN    MCMX      MC    CCSMN    CCSMX    CCSC    YGC    FGC 
 1536.0 174592.0  13312.0  512.0  512.0  11776.0  260608.0  349696.0  260608.0  260608.0      0.0 1083392.0  39344.0      0.0 1048576.0  4528.0  5474    2
3.jstat -gcutil pid
            统计gc信息统计。
  S0    S1    E      O      P    YGC    YGCT    FGC    FGCT    GCT   
  0.00  51.19  83.29  65.44  61.41    317    4.850    4    0.971    5.821
   
  S0    S1    E      O      M    CCS    YGC    YGCT    FGC    FGCT    GCT   
 68.75  0.00  46.74  57.47  96.95  95.03  5474  24.014    2    0.128  24.143
4.jstat -gcnew pid
          年轻代对象的信息。
 S0C    S1C    S0U    S1U  TT MTT  DSS      EC      EU    YGC    YGCT 
9792.0 10048.0    0.0 5143.2  3  15 9792.0 242048.0 198653.2    317    4.850
 S0C    S1C    S0U    S1U  TT MTT  DSS      EC      EU    YGC    YGCT 
 512.0  512.0  352.0    0.0 15  15  512.0  11776.0  8446.4  5474  24.014
5.jstat -gcnewcapacity pid
          年轻代对象的信息及其占用量。
NGCMN      NGCMX      NGC      S0CMX    S0C    S1CMX    S1C      ECMX        EC      YGC  FGC 
  87360.0  262144.0  262144.0  87360.0  9792.0  87360.0  10048.0  262016.0  242048.0  317    4
NGCMN      NGCMX      NGC      S0CMX    S0C    S1CMX    S1C      ECMX        EC      YGC  FGC 
  1536.0  174592.0    13312.0  57856.0    512.0  57856.0    512.0  173568.0    11776.0  5475    2
6.jstat -gcold pid
          old代对象的信息。
  PC      PU        OC          OU      YGC    FGC    FGCT    GCT   
186368.0 114451.6    323200.0    211509.3    317    4    0.971    5.821
  MC      MU      CCSC    CCSU      OC          OU      YGC    FGC    FGCT    GCT   
 39344.0  38142.6  4528.0  4303.1    260608.0    149783.6  5475    2    0.128  24.148
7.jstat -gcoldcapacity pid
          old代对象的信息及其占用量。
  OGCMN      OGCMX        OGC        OC      YGC  FGC    FGCT    GCT   
  174784.0    786432.0    323200.0    323200.0  317    4    0.971    5.821
  OGCMN      OGCMX        OGC        OC      YGC  FGC    FGCT    GCT   
  260608.0    349696.0    260608.0    260608.0  5475    2    0.128  24.148
   
   
8.jstat -gcpermcapacity pid
          perm对象的信息及其占用量。
  PGCMN      PGCMX      PGC        PC      YGC  FGC    FGCT    GCT   
  131072.0  262144.0  186368.0  186368.0  317    4    0.971    5.821
没有
9.jstat -class pid
          显示加载class的数量,及所占空间等信息。
Loaded  Bytes  Unloaded  Bytes    Time   
 25315 45671.7    5976  7754.1      15.19
Loaded  Bytes  Unloaded  Bytes    Time   
  6472 11893.0        0    0.0      5.97
10.jstat -compiler pid
          显示VM实时编译的数量等信息。
Compiled Failed Invalid  Time  FailedType FailedMethod
    4219      3      0    63.36          1 org/aspectj/weaver/ResolvedType addAndRecurse
Compiled Failed Invalid  Time  FailedType FailedMethod
  11364      1      0  107.53          1 sun/nio/cs/UTF_8$Decoder decode
11.stat -printcompilation pid
          当前VM执行的信息。
Compiled  Size  Type Method
    4219  2232    1 net/spy/memcached/protocol/ascii/BaseGetOpImpl initialize
Compiled  Size  Type Method
  11364    212    1 com/alibaba/rocketmq/client/impl/consumer/RebalanceService run
  ==================================================

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/6ba62603ccf1355ae41cbdd8c7ccf802.html