监控需求
某项目的应用服务器CPU和内存使用率的监控,通过zabbix系统监控记录应用服务器上进程的CPU和内存的使用情况,并以图表的形式实时展现,以便于我们分析服务器的性能瓶颈,利用zabbix监控系统的自动发现功能,首先编写shell脚本获取服务器的CPU和内存资源使用率最大的进程,以json的格式输出,然后对这些进程的CPU和内存资源使用情况进行监控。(本文监控的进程为Linux服务器中资源使用率最高的10个进程。)
首先使用top命令查看进程状态,再取出进程的%CPU(该值表示单个CPU的进程从上次更新到现在的CPU时间占用百分比) 和%MEM值。
由于top是交互的命令,我们把top命令的结果输出到一个文件上
[root@Mytest~] # top -b -n 1 > /tmp/.top.txt
我们先来查看一下当前系统的内存和CPU大小情况:
[root@Mytest~]# cat /proc/meminfo | grep “MemTotal” | awk ‘{printf “%.f”,$2/1024}’
3694
– CPU
[root@Mytest~]# cat /proc/cpuinfo | grep “processor” | wc -l
2
第一个脚本,获取监控进程内存资源占有率前10的进程,输出格式为json格式,用于zabbix自动发现进程
cat discovery_process.sh
#!/bin/bash
top -b -n 1 > /usr/lib/zabbix/alertscripts/log/top.txt && chown zabbix. /usr/lib/zabbix/alertscripts/log/top.txt
proc_array=(`tail -n +8 /usr/lib/zabbix/alertscripts/log/top.txt | awk '{a[$NF]+=$10}END{for(k in a)print a[k],k}'|sort -gr|head -10|cut -d" " -f2`)
length=${#proc_array[@]}
printf "{\n"
printf '\t'"\"data\":["
for ((i=0;i<$length;i++))
do
printf "\n\t\t{"
printf "\"{#PROCESS_NAME}\":\"${proc_array[$i]}\"}"
if [ $i -lt $[$length-1] ];then
printf ","
fi
done
printf "\n\t]\n"
printf "}\n"
输出的效果如下 debian系统需要bash discovery_process.sh
./discovery_process.sh
{
"data":[
{"{#PROCESS_NAME}":"node"},
{"{#PROCESS_NAME}":"mysqld"},
{"{#PROCESS_NAME}":"AliYunDun+"},
{"{#PROCESS_NAME}":"filebeat"},
{"{#PROCESS_NAME}":"systemd-j+"},
{"{#PROCESS_NAME}":"exe"},
{"{#PROCESS_NAME}":"aliyun-se+"},
{"{#PROCESS_NAME}":"systemd"},
{"{#PROCESS_NAME}":"dockerd"},
{"{#PROCESS_NAME}":"top"}
]
}
第二个脚本,用于zabbix监控的具体监控项目(item)的key,通过脚本获取第一个脚本自动发现的进程的CPU和内存的具体使用情况与使用率。
cat process_check.sh
#!/bin/bash
#system process CPU&MEM use information
mode=$1
name=$2
process=$3
mem_total=$(cat /proc/meminfo | grep "MemTotal" | awk '{printf "%.f",$2/1024}')
cpu_total=$(( $(cat /proc/cpuinfo | grep "processor" | wc -l) * 100 ))
function mempre {
mem_pre=`tail -n +8 /usr/lib/zabbix/alertscripts/log/top.txt | awk '{a[$NF]+=$10}END{for(k in a)print a[k],k}' | grep "\b${process}\b" | cut -d" " -f1`
echo "$mem_pre"
}
function memuse {
mem_use=`tail -n +8 /usr/lib/zabbix/alertscripts/log/top.txt | awk '{a[$NF]+=$10}END{for(k in a)print a[k]/100*'''${mem_total}''',k}' | grep "\b${process}\b" | cut -d" " -f1`
echo "$mem_use" | awk '{printf "%.f",$1*1024*1024}'
}
function cpuuse {
cpu_use=`tail -n +8 /usr/lib/zabbix/alertscripts/log/top.txt | awk '{a[$NF]+=$9}END{for(k in a)print a[k],k}' | grep "\b${process}\b" | cut -d" " -f1`
echo "$cpu_use"
}
function cpupre {
cpu_pre=`tail -n +8 /usr/lib/zabbix/alertscripts/log/top.txt | awk '{a[$NF]+=$9}END{for(k in a)print a[k]/('''${cpu_total}'''),k}' | grep "\b${process}\b" | cut -d" " -f1`
echo "$cpu_pre"
}
case $name in
mem)
if [ "$mode" = "pre" ];then
mempre
elif [ "$mode" = "avg" ];then
memuse
fi
;;
cpu)
if [ "$mode" = "pre" ];then
cpupre
elif [ "$mode" = "avg" ];then
cpuuse
fi
;;
*)
echo -e "Usage: $0 [mode : pre|avg] [mem|cpu] [process]"
esac
我们先来查看一下当前系统的内存和CPU大小情况:
cat /proc/meminfo | grep “MemTotal” | awk ‘{printf “%.f”,$2/1024}’
3694
执行脚本运行效果如下(获取监控项key值)
[root@Mytest~]# ./process_check.sh avg mem filebeat
23932699
[root@Mytest~]#./process_check.sh pre mem filebeat
0.6
[root@Mytest~]#./process_check.sh avg cpu filebeat
0
配置zabbix_agentd,在agentd客户端的etc/zabbix_agentd.conf中增加userparameter配置,增加进程自动发现的key,和进程资源检测的key。
UserParameter=dis.process,/usr/lib/zabbix/alertscripts/discovery_process.sh
UserParameter=proc.check[*],/usr/lib/zabbix/alertscripts/process_check.sh $1 $2 $3
配置完之后重启agentd服务
在zabbix服务器端手动获取监控项key值数据测试一下:
zabbix_get -p10050 -k 'dis.process' -s 192.168.1.21
{
"data":[
{"{#PROCESS_NAME}":"node"},
{"{#PROCESS_NAME}":"mysqld"},
{"{#PROCESS_NAME}":"AliYunDun+"},
{"{#PROCESS_NAME}":"filebeat"},
{"{#PROCESS_NAME}":"systemd-j+"},
{"{#PROCESS_NAME}":"exe"},
{"{#PROCESS_NAME}":"aliyun-se+"},
{"{#PROCESS_NAME}":"systemd"},
{"{#PROCESS_NAME}":"dockerd"},
{"{#PROCESS_NAME}":"top"}
]
}
配置完agentd后,在zabbix服务器配置Web端的模版与监控项目item
Configuration –> Templates –> Create template –>
创建完模版之后,添加自动发现规则
Discovery rules –>Create discovesy rule
添加cpu,men监控项
对主机关联新建模版;
编辑聚合图形添加要监控的主机top10
至此,zabbix自动发现进程内存和CPU使用情况并实时监控配置就完成了
执行脚本运行效果获取监控项key值:
[root@Mytest~]# ./process_check.sh avg mem mysqld #输出mysqld进程使用的内存(计算公式:3694*18.5/100)
683.39
[root@Mytest~]# ./process_check.sh pre mem mysqld #输出mysqld进程内存的使用率
15.6
[root@Mytest~]# ./process_check.sh avg cpu mysqld #单个CPU的mysqld进程使用率
3.1
[root@Mytest~]# ./process_check.sh pre cpu mysqld #所有CPU的mysqld进程的使用率
0.00386
参考url: