使用背景
線上有多臺游戲服務(wù)器,每臺游戲服務(wù)器部署多個游戲服,每個游戲服會啟動兩個java進(jìn)程夭坪,一個game_word
拱层,一個game_db
,現(xiàn)在要對這些所有機(jī)器上的所有游戲服進(jìn)程進(jìn)行內(nèi)存和CPU進(jìn)行監(jiān)控核蘸。
我使用的zabbix版本為3.4
游戲名,目錄都為臨時命名
游戲進(jìn)程如下
root 2314 2310 0 10:55 pts/0 00:01:28 java -server -Xms1024m -Xmx1024m -Xmn512m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m -XX:MaxDirectMemorySize=512m -XX:+UseParallelGC -XX:+UseParallelOldGC -XX:+DisableExplicitGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -verbose:gc -Xloggc:/gamedata/mmk_game_s11/log4j2/gc/mmk_game_s11_DB_gc.log -XX:ErrorFile=/gamedata/mmk_game_s11/log4j2/error/mmk_game_s11_DB_error_%p.log -XX:HeapDumpPath=/gamedata/mmk_game_s11/log4j2/error/mmk_game_s11_DB_heapDump_%p.hprof -cp ./classes:./config/:./libs/* core.dbsrv.main.DBStartup
root 2346 2342 0 10:55 pts/0 00:00:52 java -server -Xms2632m -Xmx2632m -Xmn1024m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m -XX:MaxDirectMemorySize=1024m -XX:+UseParallelGC -XX:+UseParallelOldGC -XX:+DisableExplicitGC -XX:+PrintGCDateStamps -XX:+PrintGCDetails -verbose:gc -Xloggc:/gamedata/mmk_game_s11/log4j2/gc/mmk_game_s11_srvWorld0_gc.log -XX:ErrorFile=/gamedata/mmk_game_s11/log4j2/error/mmk_game_s11_srvWorld0_error_%p.log -XX:HeapDumpPath=/gamedata/mmk_game_s11/log4j2/error/mmk_game_s11_srvWorld0_heapDump_%p.hprof -Dsun.zip.disableMemoryMapping=true -javaagent:libs/classReloader.jar -cp ./classes/:./config/:./libs/:./libs/* game.seam.main.WorldStartup 0
proc.mem[<name>,<user>,<mode>,<cmdline>,<memtype>]
和proc.cpu.util[<name>,<user>,<type>,<cmdline>,<mode>,<zone>]
在zabbix3.4版本中有個proc.mem
,proc.cpu.util
有這兩個key item參數(shù),可用來對單進(jìn)程的內(nèi)存和cpu進(jìn)行監(jiān)控蒿柳。
參數(shù)的相關(guān)文檔如下:
Zabbix代理監(jiān)控項(xiàng)的詳細(xì)信息
以proc.mem
這個key說明
先已簡單的nginx
進(jìn)程為例
在10.163.46.81
使用top
查看nginx
的內(nèi)存信息
在server
端,使用zabbix_get
測試key
值命令
[root@zabbix_server ~]# zabbix_get -s 10.163.46.81 -p 10050 -k "proc.mem[nginx,root]"
112234496
文檔上可以得知漩蟆,proc.mem
取得的默認(rèn)值為VIRT
的值
再次獲取一次內(nèi)存信息垒探,這次獲取ngixn
內(nèi)存RES
的值
[root@zabbix_server ~]# zabbix_get -s 10.163.46.81 -p 10050 -k "proc.mem[nginx,root,,,rss]"
4304896
這樣就能獲取單個進(jìn)程的虛擬內(nèi)存,物理內(nèi)存值怠李。
由于機(jī)器上只有一個name
值為nginx
的進(jìn)程圾叼,所以我們在使用proc.mem
直接指定name
值即可。
但我們實(shí)際要監(jiān)控的游戲進(jìn)程都為java
的進(jìn)程名捺癞,那要如何處理呢夷蚊?
這時,就需要proc.mem
的cmdline
參數(shù)髓介,cmdline
參數(shù)可支持正則惕鼓。
cmdline
又是什么呢?
以剛才的java進(jìn)程為例:
剛才java
有個進(jìn)程號為2314
,打印出cmdline
值
[root@zabbix_agemt tmp]# cat /proc/2314/cmdline
java-server-Xms1024m-Xmx1024m-Xmn512m-XX:MetaspaceSize=128m-XX:MaxMetaspaceSize=256m-XX:MaxDirectMemorySize=512m-XX:+UseParallelGC-XX:+UseParallelOldGC-XX:+DisableExplicitGC-XX:+PrintGCDateStamps-XX:+PrintGCDetails-verbose:gc-Xloggc:/gamedata/mmk_game_s11/log4j2/gc/mmk_game_s11_DB_gc.log-XX:ErrorFile=/gamedata/mmk_game_s11/log4j2/error/mmk_game_s11_DB_error_%p.log-XX:HeapDumpPath=/gamedata/mmk_game_s11/log4j2/error/mmk_game_s11_DB_heapDump_%p.hprof-cp./classes:./config/:./libs/*core.dbsrv.main.DBStartup
所以此處cmdline
取每個服的特有值mmk_game_s11_DB
使用proc.mem
打印出這個服的db
的內(nèi)存值
[root@zabbix_server tmp]# zabbix_get -s 10.163.46.81 -p 10050 -k "proc.mem[,root,,mmk_game_s1_srvWorld0,rss]"
608288768
這樣就取到了這個游戲服單個進(jìn)程的RES
內(nèi)存值
這是手動獲取單個服的DB
內(nèi)存版保,為了后續(xù)能使用自主發(fā)現(xiàn)功能呜笑,我們需要寫個腳本,把每臺機(jī)器上的游戲服名稱獲取出來彻犁。
編寫獲取游戲服的腳本
在zabbix_agent
端編寫叫胁,腳本直接放在zabbix/script
中
[root@zabbix_agent zabbix]# cat script/check_porcess.sh
#!/bin/bash
## zabbix process
## date: 2017.11.27
process_dir=/gamedata
game_list=`ls ${process_dir}|grep game`
game_num=0
INDEX=0
for game in `echo ${game_list}`;do
game_world_pid=`ps aux|grep java|grep ${game}|grep srvWorld0|awk '{print $2}'`
if [ -n "${game_world_pid}" ];then
((game_num++))
fi
done
echo '{"data":['
for game in `echo ${game_list}`;do
game_world_pid=`ps aux|grep java|grep ${game}|grep srvWorld0|awk '{print $2}'`
if [ -n "${game_world_pid}" ];then
echo '{"{#PROCESSNAME}":"'${game}_srvWorld0'"},'
INDEX=`expr $INDEX + 1`
if [ $INDEX -lt ${game_num} ];then
echo '{"{#PROCESSNAME}":"'${game}_DB'"},'
else
echo '{"{#PROCESSNAME}":"'${game}_DB'"}'
fi
fi
done
echo ']}'
直接運(yùn)行腳本,測試腳本是否正常汞幢。
[root@zabbix_agent zabbix]# sh script/check_porcess.sh
{"data":[
{"{#PROCESSNAME}":"mmk_game_s1_srvWorld0"},
{"{#PROCESSNAME}":"mmk_game_s1_DB"},
{"{#PROCESSNAME}":"mmk_game_s99_srvWorld0"},
{"{#PROCESSNAME}":"mmk_game_s99_DB"}
]}
修改zabbix_agent
修改配置文件以及添加配置文件
[root@zabbix_agent zabbix]# cat etc/zabbix_agentd.conf|grep -v ^#|grep -v ^$
LogFile=/tmp/zabbix_agentd.log
Server=10.163.254.250
ServerActive=10.163.254.250
Hostname=zabbix_agent
Include=/usr/local/zabbix/etc/zabbix_agentd.conf.d
UnsafeUserParameters=1
其中修改的內(nèi)容就是添加最后兩行信息
Include=/usr/local/zabbix/etc/zabbix_agentd.conf.d
UnsafeUserParameters=1
然后在zabbix_agentd.conf.d
添加一個新的配置文件信息
[root@zabbix_agent zabbix]# cat etc/zabbix_agentd.conf.d/java_process.conf
UserParameter=gameprocess,/usr/local/zabbix/script/check_porcess.sh
在server
端測試key
值gameprocess
是否正常
[root@zabbix_server ~]# zabbix_get -s 10.163.46.81 -p 10050 -k "gameprocess"
{"data":[
{"{#PROCESSNAME}":"mmk_game_s1_srvWorld0"},
{"{#PROCESSNAME}":"mmk_game_s1_DB"},
{"{#PROCESSNAME}":"mmk_game_s99_srvWorld0"},
{"{#PROCESSNAME}":"mmk_game_s99_DB"}
]}
腳本內(nèi)容到此完成驼鹅,下面開始模板創(chuàng)建。
創(chuàng)建新的模板森篷,添加自主發(fā)現(xiàn)內(nèi)容
創(chuàng)建模板
關(guān)聯(lián)Template OS Linux
模板
在模板中添加discovery
此處一定要在模板中創(chuàng)建输钩,而不是最頂端的那個discovery
添加一個discovery rule
在模板中添加Item prototypes
創(chuàng)建三個Item prototypes
,兩個內(nèi)存的仲智,一個CPU的
在模板中添加Graph prototypes
至此模板已創(chuàng)建完成买乃。
開始創(chuàng)建網(wǎng)絡(luò)發(fā)現(xiàn)服務(wù),讓主機(jī)自動關(guān)聯(lián)剛剛創(chuàng)建的模板001_process_template
添加action