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效果

相關文章
相關標籤/搜索