Zabbix 3.4监控JVM内存的方法

首先咱们要使用root用户关闭selinux,这一步不少使用CentOS和红帽的运维人员都会装机完就关闭selinux,并非多新鲜的事情了java

setenforce 0

而后咱们须要赋予zabbix用户sudo到root的权限,这波操做很是神奇,下面是在RHEL 7下面的操做,RHEL6也相似。linux

在/etc/sudoers.d下面新建一个名为zabbix的文件,里面填写在何种状况下容许zabbix提高到root权限,内容以下:tomcat

zabbix ALL=(ALL) NOPASSWD: /usr/local/bin/jstat.sh *

上面那句话就是zabbix能够在执行/usr/local/bin/jstat.sh这个脚本的时候sudo到root权限,并且不须要输入root的密码,这样一来实际上是很是危险的,其余人只要修改上面脚本的内容,就能够轻松的经过黑进zabbix获取root权限。因此这个脚本要配置成只读的,起码对于root之外的用户要没法修改才行。要是你连这个脚本都不限定,直接容许zabbix直接获取root权限,那就更危险了。bash

因为zabbix用户是没有终端权限的,这一点能够在/etc/passwd中看到/sbin/nologin 的配置,因此咱们还须要取消sudo必须有tty权限的系统默认设定,方法就是修改/etc/sudoers这个文件,但首先须要将这个文件添加可读写权限,不然即便是root也没法修改这个文件服务器

chmod +w /etc/sudoers


而后vi编辑这个文件,找到 Defaults    requiretty 这一行,改为,加一个叹号运维

Defaults !requiretty


而后咱们的zabbix如今已经拥有了执行jstat的权限,能够开始编写相关脚本了。这个脚本接收两个参数ui

第一个参数是你要获取哪一个内存区域的名称,好比Eden,Old,Perm等等spa

第二个参数是进程的名称的关键字,方便根据这个名称去获取这个进程的Pid,这个名称要有惟一性,能够经过ps -ef而后仔细观察Tomcat或者其余中间件创建的进程来得到。好比tomcat在启动的时候通常会把配置文件写在进程信息中,因而我就把这个配置文件的路径做为关键字.net

 

而后脚本就会自动获取这个进程所对应的Pid,而后分析是JDK 1.8仍是1.7 1.6,执行jstat命令,而后经过awk获取相关内存区域的百分比,提供给zabbix server。脚本以下,脚本路径为/usr/local/bin/jstat.sh,注意下面的JAVA_HOME等参数要根据你服务器的实际路径去修改。3d

#!/bin/bash
JAVA8_HOME=/usr/jdk1.8.0_91/
JAVA7_HOME=/usr/jdk1.7.0_79/
JAVA6_HOME=/usr/jdk1.6.0_27/
JHOME=/usr/

function Survivor0 { 
$JHOME/bin/jstat -gcutil $pid | awk 'NR==2 {print $1}'
} 
function Survivor1 { 
$JHOME/bin/jstat -gcutil $pid | awk 'NR==2 {print $2}'
} 
function Eden { 
$JHOME/bin/jstat -gcutil $pid | awk 'NR==2 {print $3}'
} 
function Old { 
$JHOME/bin/jstat -gcutil $pid | awk 'NR==2 {print $4}'
} 
function Perm { 
$JHOME/bin/jstat -gcutil $pid | awk 'NR==2 {print $5}'
} 
function Metaspace { 
$JHOME/bin/jstat -gcutil $pid | awk 'NR==2 {print $5}'
}


process=$(ps -ef | grep "$2" | grep -v 'jstat' | grep -v 'grep' | awk 'NR==1 {print $0}')
pid=$(echo $process | awk '{print $2}')

java8=$(echo $process | grep jdk1.8)
java7=$(echo $process | grep jdk1.7)
java6=$(echo $process | grep jdk1.6)

if [ ! -z "$java8" ];then
JHOME=$JAVA8_HOME
elif [ ! -z "$java7" ];then
JHOME=$JAVA7_HOME
elif [ ! -z "$java6" ];then
JHOME=$JAVA6_HOME
fi


$1 "$2"

 

注意,使用ps -ef  | grep“进程名”的时候,因为zabbix脚本自己会带有一个进程名参数,grep命令也会带有一个进程名参数,因此这条命令执行出来至少有三个进程符合条件,因此上面使用了两遍 grep -v命令来去除干扰项,而后若是还有多个进程知足该关键字,只会去结果里的第一行。

而后咱们就把咱们的这个自定义脚本增长到被监控服务器的zabbix客户端配置文件里,方法就是新建一个/etc/zabbix/zabbix_agentd.d/userparameter_jstat.conf文件,内容以下

UserParameter=custom.jstat[*],sudo /usr/local/bin/jstat.sh $1 $2


注意上面是经过sudo提高了权限

而后使咱们刚加的自定义key在zabbix客户机上生效

service zabbix-agent restart


而后咱们就能够到zabbix server上来探测脚本是否能够正常运行

[alex@localhost ~]$ zabbix_get -s 192.168.1.2 -k custom.jstat[Old,tomcat]
35.86

 

若是能正常出现一个百分数,那么就说明成功了,下面咱们能够到zabbix网页端添加相关的监控项和图像。其中主要就是把key填写正确就好

 

而后重复上面的步骤,将你须要观察的项目都添加相应的监控项,注意JDK 1.8以后Perm区变成了MetaSpace区

而后再创建图形,上面创建的五个监控项都添加到图形中去

而后等待一会就能够看见效果啦

JDK 1.7效果

JDK 1.8效果

相关文章
相关标签/搜索