监控需求
某项目的应用服务器CPU和内存使用率的监控,通过zabbix系统监控记录应用服务器上进程的CPU和内存的使用情况,并以图表的形式实时展现,以便于我们分析服务器的性能瓶颈。
监控方式
利用zabbix监控系统的自动发现功能,首先编写shell脚本获取服务器的CPU和内存资源使用率最大的进程,以json的格式输出,然后对这些进程的CPU和内存资源使用情况进行监控。(本文监控的进程为Linux服务器中资源使用率最高的10个进程。)
缺点
不适用于监控固定的进程
首先使用top命令查看进程状态,再取出进程的%CPU(该值表示单个CPU的进程从上次更新到现在的CPU时间占用百分比) 和%MEM值。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
hmracdb2:~
# top
top
- 13:57:01 up 32 days, 5:21, 2
users
, load average: 0.14, 0.26, 0.34
Tasks: 206 total, 1 running, 205 sleeping, 0 stopped, 0 zombie
Cpu(s): 3.7%us, 2.7%sy, 0.0%ni, 87.2%
id
, 6.3%wa, 0.0%hi, 0.1%si, 0.0%st
Mem: 3926096k total, 3651612k used, 274484k
free
, 788120k buffers
Swap: 4193276k total, 1369968k used, 2823308k
free
, 1443884k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2365 root 20 0 854m 315m 12m S 3 8.2 1252:49 ohasd.bin
5307 oracle 20 0 1783m 22m 22m S 3 0.6 1106:03 oracle
4532 root 20 0 676m 31m 13m S 2 0.8 853:35.32 crsd.bin
4272 grid RT 0 437m 282m 52m S 2 7.4 1006:47 ocssd.bin
5279 oracle 20 0 1771m 60m 48m S 2 1.6 477:11.19 oracle
5122 oracle 20 0 654m 15m 12m S 1 0.4 537:40.85 oraagent.bin
|
由于top是交互的命令,我们把top命令的结果输出到一个文件上
hmracdb2:~ # top -b -n 1 > /tmp/.top.txt
第一个脚本,获取监控进程内存资源占有率前10的进程,输出格式为json格式,用于zabbix自动发现进程
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
# cat discovery_process.sh
#!/bin/bash
#system process discovery script
top
-b -n 1 >
/tmp/
.
top
.txt &&
chown
zabbix.
/tmp/
.
top
.txt
proc_array=(`
tail
-n +8
/tmp/
.
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"
|
或者
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
# cat discovery_process2.sh
#!/bin/bash
#system process discovery script
top
-b -n 1 >
/tmp/
.
top
.txt &&
chown
zabbix.
/tmp/
.
top
.txt
proc_array=`
tail
-n +8
/tmp/
.
top
.txt |
awk
'{a[$NF]+=$10}END{for(k in a)print a[k],k}'
|
sort
-gr|
head
-10|
cut
-d
" "
-f2`
length=`
echo
"${proc_array}"
|
wc
-l`
count=0
echo
'{'
echo
-e
'\t"data":['
echo
"$proc_array"
|
while
read
line
do
echo
-en
'\t\t{"{#PROCESS_NAME}":"'
$line
'"}'
count=$(( $count + 1 ))
if
[ $count -lt $length ];
then
echo
','
fi
done
echo
-e
'\n\t]'
echo
'}'
|
输出的效果如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
[root@Zabbix_19F ~]
# ./discovery_process.sh
{
"data"
:[
{
"{#PROCESS_NAME}"
:
"mysqld"
},
{
"{#PROCESS_NAME}"
:
"php-fpm"
},
{
"{#PROCESS_NAME}"
:
"zabbix_server"
},
{
"{#PROCESS_NAME}"
:
"nginx"
},
{
"{#PROCESS_NAME}"
:
"sshd"
},
{
"{#PROCESS_NAME}"
:
"bash"
},
{
"{#PROCESS_NAME}"
:
"zabbix_agentd"
},
{
"{#PROCESS_NAME}"
:
"qmgr"
},
{
"{#PROCESS_NAME}"
:
"pickup"
},
{
"{#PROCESS_NAME}"
:
"master"
}
]
}
|
第二个脚本,用于zabbix监控的具体监控项目(item)的key,通过脚本获取第一个脚本自动发现的进程的CPU和内存的具体使用情况与使用率。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
|
#!/bin/bash
#system process CPU&MEM use information
#mail: mail@huangming.org
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
/tmp/
.
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
/tmp/
.
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
/tmp/
.
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
/tmp/
.
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大小情况:
1
2
3
4
5
6
|
-- 内存
[root@Zabbix_19F ~]
# cat /proc/meminfo | grep "MemTotal" | awk '{printf "%.f",$2/1024}'
3832
-- CPU
[root@Zabbix_19F ~]
# cat /proc/cpuinfo | grep "processor" | wc -l
8
|
执行脚本运行效果如下(获取监控项key值)
1
2
3
4
5
6
7
8
|
[root@Zabbix_19F ~]
# ./process_check.sh avg mem mysqld #输出mysqld进程使用的内存(计算公式:3832*18.5/100)
708.92
[root@Zabbix_19F ~]
# ./process_check.sh pre mem mysqld #输出mysqld进程内存的使用率
18.5
[root@Zabbix_19F ~]
# ./process_check.sh avg cpu mysqld #单个CPU的mysqld进程使用率
3.9
[root@Zabbix_19F ~]
# ./process_check.sh pre cpu mysqld #所有CPU的mysqld进程的使用率
0.004875
|
配置zabbix_agentd,在agentd客户端的etc/zabbix_agentd.conf中增加userparameter配置,增加进程自动发现的key,和进程资源检测的key。
1
2
3
|
hmracdb2:
/opt/zabbix
# vim etc/zabbix_agentd.conf.d/userparameter_script.conf
UserParameter=discovery.process,
/opt/zabbix/scripts/discovery_process
.sh
UserParameter=process.check[*],
/opt/zabbix/scripts/process_check
.sh $1 $2 $3
|
配置完之后重启agentd服务
1
2
3
|
hmracdb2:
/opt/zabbix
# service zabbix_agentd restart
Shutting down zabbix_agentd
done
Starting zabbix_agentd
done
|
在zabbix服务器端手动获取监控项key值数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
[root@Zabbix_19F ~]
# zabbix_get -p10050 -k 'discovery.process' -s 10.xxx.xxx.xxx
{
"data"
:[
{
"{#PROCESS_NAME}"
:
"ohasd.bin"
},
{
"{#PROCESS_NAME}"
:
"ocssd.bin"
},
{
"{#PROCESS_NAME}"
:
"oracle"
},
{
"{#PROCESS_NAME}"
:
"oraagent.bin"
},
{
"{#PROCESS_NAME}"
:
"crsd.bin"
},
{
"{#PROCESS_NAME}"
:
"orarootagent.bi"
},
{
"{#PROCESS_NAME}"
:
"watchdog/3"
},
{
"{#PROCESS_NAME}"
:
"watchdog/2"
},
{
"{#PROCESS_NAME}"
:
"watchdog/1"
},
{
"{#PROCESS_NAME}"
:
"watchdog/0"
}
]
}
[root@Zabbix_19F ~]
# zabbix_get -p10050 -k 'process.check[pre,mem,oracle]' -s 10.xxx.xxx.xxx
2.9
[root@Zabbix_19F ~]
# zabbix_get -p10050 -k 'process.check[avg,mem,oracle]' -s 10..xxx.xxx.xxx
111.186
[root@Zabbix_19F ~]
# zabbix_get -p10050 -k 'process.check[avg,cpu,oracle]' -s 10..xxx.xxx.xxx
4
[root@Zabbix_19F ~]
# zabbix_get -p10050 -k 'process.check[pre,cpu,oracle]' -s 10..xxx.xxx.xxx
0.01
|
配置完agentd后,在zabbix服务器配置Web端的模版与监控项目item
Configuration --> Templates --> Create template -->
创建完模版之后,添加自动发现规则
Discovery rules -->Create discovesy rule
Item prototypes --> Create item prototype
也可以继续添加监控的主机和所需监控项,添加完后我们可以查看下监控的历史数据
添加一个进程的CPU使用率的监控项
查看历史数据
当然还可以获取进程内存使用的具体大小情况
至此,zabbix自动发现进程内存和CPU使用情况并实时监控配置就完成了
附件:http://down.51cto.com/data/2366527