通过查询文章结合自身实际情况,总结而出
1.必要条件
1.获取tomcat进程的PID
[root@dxm-beta operation]# ps -ef|grep tomcat
http 1727 1 5 Jul21 ? 00:45:53 /usr/java/default/bin/java -Djava.util.logging.config.file=/data/webapps/wish_frontend/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /usr/local/tomcat/bin/bootstrap.jar:/usr/local/tomcat/bin/tomcat-juli.jar -Dcatalina.base=/data/webapps/wish_frontend -Dcatalina.home=/usr/local/tomcat -Djava.io.tmpdir=/data/webapps/wish_frontend/temp org.apache.catalina.startup.Bootstrap start
2.linux下监控jvm的gc状态的工具为jdk自带:!!#ff0000 jstat!!
[root@dxm-beta operation]# jstat -gccause 1727 1 1
S0 S1 E O M CCS YGC YGCT FGC FGCT GCT LGCC GCC
0.00 99.28 49.60 97.96 84.28 88.95 769 41.411 21 30.006 71.417 Allocation Failure No GC
2.zabbix-agent客户端监控脚本
/root/shell/zabbix/get_jvm_gc_status.sh
#!/bin/bash
JavaBinDir='/usr/java/jdk1.8.0_261-amd64/bin/' #java执行目录
PID=`ps -ef |grep tomcat|grep wish_frontend|awk '{print $2}'` #获取进程PID
flag=0
for i in $PID
do
if [ ! -z $i ]
then
let flag+=1
fi
done
if [ $flag -ne 1 ]
then
echo "the number of $TargetWord is more than 1 !!!"
exit
fi
# get value from jstat
function gcstat_colum(){
if [ ! -z ${1} ] && [ -z ${2} ]
then
ret=`"${JavaBinDir}"jstat -gccause $PID 1 1 |tail -1|awk -F' ' '{print $'${1}'}'`
echo $ret
elif [ ! -z ${1} ]&& [ ! -z ${2} ]
then
ret=`"${JavaBinDir}"jstat -gccause $PID 1 1 |tail -1|awk -F' ' '{print $'${1}',$'${2}'}'`
echo $ret
else
echo 'function get wrong arguments !'
fi
}
# print prompt when script parameter is wrong
function print_prompt(){
echo ' please input correct parameter !'
echo '
s1 (Survivor0)
s2 (Survivor1)
eden(Eden)
old (Old)
meta(Metaspace)
css (CCS)
ygc (YGC)
ygct(YGCT)
fgc (FGC)
fgct(FGCT)
gct (GCT)
lgcc(LGCC)
gcc (GCC)
'
}
# transfer script's parameter to function gcstat_colum()
case $1 in
s1)
gcstat_colum 1
;;
s2)
gcstat_colum 2
;;
eden)
gcstat_colum 3
;;
old)
gcstat_colum 4
;;
meta)
gcstat_colum 5
;;
css)
gcstat_colum 6
;;
ygc)
gcstat_colum 7
;;
ygct)
gcstat_colum 8
;;
fgc)
gcstat_colum 9
;;
fgct)
gcstat_colum 10
;;
gct)
gcstat_colum 11
;;
lgcc)
gcstat_colum 12 13
;;
gcc)
gcstat_colum 14 15
;;
*)
print_prompt
;;
esac
#添加执行权限
[root@dxm-beta ~]# chmod +x /root/shell/zabbix/get_jvm_gc_status.sh
3.允许zabbix提升到root权限,使其拥有执行jstat的权限
[root@dxm-beta ~]# vim /etc/sudoers.d/zabbix
zabbix ALL=(ALL) NOPASSWD: /root/shell/zabbix/get_jvm_gc_status.sh *
[root@dxm-beta ~]# chmod 777 /etc/sudoers
[root@dxm-beta ~]# vim /etc/sudoers
Defaults:zabbix !requiretty
4.zabbix-agent客户端配置自定义键值
[root@dxm-beta ~]# vim /usr/local/zabbix/etc/zabbix_agentd.conf.d/userparameter_socket.conf
UserParameter=Socket.Survivor0,sudo /root/shell/zabbix/get_jvm_gc_status.sh s1
UserParameter=Socket.Survivor1,sudo /root/shell/zabbix/get_jvm_gc_status.sh s2
UserParameter=Socket.Eden,sudo /root/shell/zabbix/get_jvm_gc_status.sh eden
UserParameter=Socket.Old,sudo /root/shell/zabbix/get_jvm_gc_status.sh old
UserParameter=Socket.Metaspace,sudo /root/shell/zabbix/get_jvm_gc_status.sh meta
UserParameter=Socket.CCS,sudo /root/shell/zabbix/get_jvm_gc_status.sh css
UserParameter=Socket.YGC,sudo /root/shell/zabbix/get_jvm_gc_status.sh ygc
UserParameter=Socket.YGCT,sudo /root/shell/zabbix/get_jvm_gc_status.sh ygct
UserParameter=Socket.FGC,sudo /root/shell/zabbix/get_jvm_gc_status.sh fgc
UserParameter=Socket.FGCT,sudo /root/shell/zabbix/get_jvm_gc_status.sh fgct
UserParameter=Socket.GCT,sudo /root/shell/zabbix/get_jvm_gc_status.sh gct
UserParameter=Socket.LGCC,sudo /root/shell/zabbix/get_jvm_gc_status.sh lgcc
UserParameter=Socket.GCC,sudo /root/shell/zabbix/get_jvm_gc_status.sh gcc
agent修改配置后需要重启
[root@dxm-beta ~]# service zabbix_agentd restart
5.web端添加自定义item
1.创建模板,模板名称为Templates Socket
2.在新模板Templates Socke 下创建一个应用,名为 JVM
3.在应用下创建item,比如 Socket.Eden
4.其他item都类似,添加完毕如下图
注:GCC 和 LGCC的数据类型为字符,其余数据类型都是float浮点数。
S0:幸存1区当前使用比例
S1:幸存2区当前使用比例
E:伊甸园区使用比例
O:老年代使用比例
M:元数据区使用比例
CCS:压缩使用比例
YGC:年轻代垃圾回收次数
FGC:老年代垃圾回收次数
FGCT:老年代垃圾回收消耗时间
GCT:垃圾回收消耗总时间