-
~/rrdtool 디렉토리를 만들고 스크립트를 다운로드 받은 후 cron 에 1분마다 실행되도록 하면 설치는 완료된다.
windy@wl ~/rrdtool $ crontab -l
* * * * * /PATH/TO/rrd.sh
windy@wl ~/rrdtool $ cat rrd.sh
#!/bin/bash
cd ~/rrdtool
./rrdtool_net.sh
...
windy@wl ~/rrdtool $ ls -l
-rwxr-xr-x 1 windy staff 222 7월 21일 14:16 rrd.sh*
-rwxr-xr-x 1 windy staff 1950 7월 21일 14:14 rrdtool_net.sh*
...
windy@wl ~/rrdtool $ ./rrd.sh
windy@wl ~/rrdtool $ ls -l
-rwxr-xr-x 1 windy staff 222 7월 21일 14:16 rrd.sh*
-rw-r--r-- 1 windy staff 21458 7월 21일 14:25 rrdtool_load.png
-rw-r--r-- 1 windy staff 93680 7월 21일 14:25 rrdtool_load.rrd
-rwxr-xr-x 1 windy staff 1018 7월 21일 13:54 rrdtool_load.sh*
-rwxr-xr-x 1 windy staff 1950 7월 21일 14:14 rrdtool_net.sh*
-rw-r--r-- 1 windy staff 48760 7월 21일 14:25 rrdtool_net_e1000g0.rrd
-rw-r--r-- 1 windy staff 22816 7월 21일 14:25 rrdtool_net_e1000g0_bit.png
-rw-r--r-- 1 windy staff 23347 7월 21일 14:25 rrdtool_net_e1000g0_pks.png
...
-
시스템의 로드 에버리지를 얻어와 저장하고 그래프를 그린다. 솔라리스 기준으로, 리눅스나 다른 운영체제에서는 /tmp/rrdtool 를 확인해 [0.00:0.00:0.00]과 같이 제대로 가져오는지 확인해야 한다. 제대로 나오지 않으면 sed, awk 부분을 수정해야할 것이다.
#!/bin/bash
# Monitoring load average for solaris
# WindyHana's Solanara: RRDtool
# http://www.solanara.net/solanara/rrdtool
. /etc/profile
PATH=/usr/bin:/usr/local/rrdtool/bin
cd ~/rrdtool
LANG=C
# /tmp/rrdtool_load file format
# 1min load average:5min load average, 15min load average
# ex) 1.00:0.50:0.10
#
uptime | sed -e 's/^.*load average.*: //' -e 's/ //g' | awk -F, "{ printf(\"%f:%f:%f\", \$1, \$2, \$3)}" > /tmp/rrdtool
DATA=`cat /tmp/rrdtool`
FN="rrdtool_load.rrd"
if [ ! -f $FN ]; then
rrdtool create $FN \
--step 60 \
"DS:1min:GAUGE:600:0:U" \
"DS:5min:GAUGE:600:0:U" \
"DS:15min:GAUGE:600:0:U" \
"RRA:LAST:0.5:1:1440" \
"RRA:MAX:0.5:60:2400"
fi
rrdtool update $FN N:$DATA
rrdtool graph rrdtool_load.png \
--start -1d \
--vertical-label "Load average" \
--title "Load averages" \
--width 500 \
--height 100 \
--alt-autoscale-max \
--units-exponent 0 \
"DEF:1mind=$FN:1min:LAST" \
"DEF:5mind=$FN:5min:LAST" \
"DEF:15mind=$FN:15min:LAST" \
"DEF:15minx=$FN:15min:MAX" \
"GPRINT:1mind:LAST:%.2lf" \
"GPRINT:5mind:LAST:%.2lf" \
"GPRINT:15mind:LAST:%.2lf" \
"AREA:15mind#E0E0E0:15MIN" \
"LINE:5mind#8080FF:5MIN" \
"LINE:1mind#FF8080:1MIN" \
"HRULE:8#FF0000:WARNING" \
> /dev/null
-
시스템의 각 NIC마다 전송된 패킷 수 및 바이트 수를 얻어와 저장하고 그래프를 그린다. kstat(1M) 를 사용했다.
#!/bin/bash
# Monitoring network traffic/packets for solaris
# WindyHana's Solanara: RRDtool
# http://www.solanara.net/solanara/rrdtool
# last update: 2011.02.21
. /etc/profile
PATH=/usr/bin:/usr/local/rrdtool/bin
cd ~/rrdtool
LANG=C
# /tmp/rrdtool_net file format
# InterfaceName InputPackets OutputPackets InputBytes OutputBytes InterfaceSpeed per each line.
# -> e1000g0 ipackets obytes opackets rbytes ifspeed
# Do not use 64bit integer for compatibility issue.
kstat -c net -p ':::[or]bytes' -p ':::[io]packets' -p ':::ifspeed' \
| sed '/lo/d' \
| awk 'BEGIN{FS=":"} {print $3,$4}' \
| awk '{print $1,$2,$3}' \
| sort -k 1,2 \
| sed -n -e 'N;N;N;N;s/\n/ /g;p' \
| awk '{print $1,$6,$12,$15,$9,$3}' \
> /tmp/rrdtool_net
cat /tmp/rrdtool_net | while read LINE
do
IFNAME=`echo $LINE | awk '{print $1}'`
DATA=`echo $LINE | awk '{print $2,$3,$4,$5}' | sed -e 's/ /:/g'`
IFSPEED=`echo $LINE | awk '{print $6}'`
FN="rrdtool_net_$IFNAME.rrd"
if [ "$IFSPEED" == "10000000" ]; then
IFSPEEDMSG="10Mbps"
elif [ "$IFSPEED" == "100000000" ]; then
IFSPEEDMSG="100Mbps"
elif [ "$IFSPEED" == "1000000000" ]; then
IFSPEEDMSG="1Gbps"
elif [ "$IFSPEED" == "10000000000" ]; then
IFSPEEDMSG="10Gbps"
else
IFSPEEDMSG="?"
fi
if [ ! -f $FN ]; then
rrdtool create $FN \
--step 60 \
"DS:packets_in:COUNTER:600:0:U" \
"DS:packets_out:COUNTER:600:0:U" \
"DS:bytes_in:COUNTER:600:0:U" \
"DS:bytes_out:COUNTER:600:0:U" \
"RRA:LAST:0.5:1:1440" \
"RRA:MAX:0.5:60:24"
fi
rrdtool update $FN N:$DATA
rrdtool graph rrdtool_net_${IFNAME}_pks.png \
--start -1d \
--vertical-label "Packets/s" \
--title "Network Traffics ${IFNAME} ($IFSPEEDMSG)" \
--width 500 \
--height 100 \
--alt-autoscale-max \
"DEF:pi=$FN:packets_in:LAST" \
"DEF:po=$FN:packets_out:LAST" \
"CDEF:gpi=pi" \
"CDEF:gpo=po" \
"AREA:gpi#FF8080:Input Packets/s" \
"LINE:gpo#00A000:Output Packets/s" \
> /dev/null
rrdtool graph rrdtool_net_${IFNAME}_bit.png \
--start -1d \
--vertical-label "bytes/s" \
--title "Network Traffics ${IFNAME} ($IFSPEEDMSG)" \
--width 500 \
--height 100 \
--alt-autoscale-max \
"DEF:bi=$FN:bytes_in:LAST" \
"DEF:bo=$FN:bytes_out:LAST" \
"CDEF:gbi=bi" \
"CDEF:gbo=bo" \
"AREA:gbi#FF8080:Input bytes/s" \
"LINE:gbo#00A000:Output bytes/s" \
> /dev/null
done


-
메모리 사용량을 모니터링 해준다. 스크립트는 mdb(1)를 사용했기 때문에, root 권한으로 실행시켜야 한다.
#!/bin/bash
# Monitoring memory usage for solaris
# WindyHana's Solanara: RRDtool
# http://www.solanara.net/solanara/rrdtool
# last update: 2011.02.21
. /etc/profile
PATH=/usr/bin:/usr/local/rrdtool/bin
cd ~windy/rrdtool
LANG=C
if [ "$UID" != "0" ]; then
echo "Must run as root"
exit 1
fi
# /tmp/rrdtool_mem file format
# Kernel ZFS Anon ExecLib Page FreeCache FreeList Total (in pages)
PAGESIZE=`pagesize`
HOSTNAME=`hostname`
echo "::memstat" | mdb -k > /tmp/rrdtool_mem
MDBLINES=`cat /tmp/rrdtool_mem | wc -l | awk '{print $1}'`
if [ "$MDBLINES" == "11" ]; then
cat /tmp/rrdtool_mem \
| sed '1,2d' \
| sort -k 1 \
| awk '{print substr($0, 18, 100) }' \
| awk '{print $1 }' \
| sed -n -e 'N;N;N;N;N;N;N;N;s/\n/ /g;p' \
| awk '{print $5,$8,$1,$2,$6,$3,$4,$7}' \
> /tmp/rrdtool_mem2
elif [ "$MDBLINES" == "12" ]; then
echo "TODO"
exit 1
else
echo "ERROR: Cannot recognize MDB Output [$MDBLINES]"
exit 1
fi
rm /tmp/rrdtool_mem
DATA=`cat /tmp/rrdtool_mem2 | sed -e 's/ /:/g'`
rm /tmp/rrdtool_mem2
FN="rrdtool_mem.rrd"
if [ ! -f $FN ]; then
rrdtool create $FN \
--step 60 \
"DS:kern:GAUGE:600:0:U" \
"DS:zfsd:GAUGE:600:0:U" \
"DS:anon:GAUGE:600:0:U" \
"DS:exec:GAUGE:600:0:U" \
"DS:page:GAUGE:600:0:U" \
"DS:fcah:GAUGE:600:0:U" \
"DS:flst:GAUGE:600:0:U" \
"DS:tot:GAUGE:600:0:U" \
"RRA:LAST:0.5:1:1440" \
"RRA:MAX:0.5:60:24"
fi
rrdtool update $FN N:$DATA
rrdtool graph rrdtool_mem.png \
--start -1d \
--vertical-label "Memory Usage" \
--title "Memory Usage ($HOSTNAME)" \
--width 500 \
--height 100 \
--base 1024 \
--lower-limit 0 \
--rigid \
"DEF:kern=$FN:kern:LAST" \
"DEF:zfsd=$FN:zfsd:LAST" \
"DEF:anon=$FN:anon:LAST" \
"DEF:exec=$FN:exec:LAST" \
"DEF:page=$FN:page:LAST" \
"DEF:fcah=$FN:fcah:LAST" \
"DEF:flst=$FN:flst:LAST" \
"DEF:tot=$FN:tot:LAST" \
"CDEF:ckern=kern,$PAGESIZE,*" \
"CDEF:czfsd=zfsd,$PAGESIZE,*" \
"CDEF:canon=anon,$PAGESIZE,*" \
"CDEF:cexec=exec,$PAGESIZE,*" \
"CDEF:cpage=page,$PAGESIZE,*" \
"CDEF:cfcah=fcah,$PAGESIZE,*" \
"CDEF:cflst=flst,$PAGESIZE,*" \
"CDEF:ctot=tot,$PAGESIZE,*" \
"AREA:ckern#D0D0D0:Kernel" \
"STACK:canon#FFC0C0:Anon" \
"STACK:cexec#FFE0E0:Exec" \
"STACK:cpage#FF0000:Page" \
"STACK:czfsd#80FF80:ZFS Data" \
"STACK:cfcah#B0FFB0:FreeCache" \
"STACK:cflst#F0FFF0:FreeList" \
"LINE:ctot#0000FF:Total" \
> /dev/null
-
디스크 사용량을 모니터링 해준다. UFS로 마운트 된 각 마운트 지점과, ZFS 풀의 전체 용량과 사용량을 모니터링 한다.
#!/bin/bash
# Monitoring disk usage for solaris
# WindyHana's Solanara: RRDtool
# http://www.solanara.net/solanara/rrdtool
# last update: 2011.07.13
. /etc/profile
PATH=/usr/bin:/usr/sbin:/usr/local/rrdtool/bin
cd `dirname $0`
LANG=C
CONFFN="rrdtool_dsk.conf"
FN="rrdtool_dsk.rrd"
declare -a COLORS
COLORS=('#FFFFFF' '#0000FF' '#00FFFF' '#FF00FF' '#FFFF00' '#FF0000')
if [ ! -f $CONFFN ]; then
UFS=`mount -p | awk '{print $3}' | grep ufs`
if [ -x /usr/sbin/zpool ]; then
ZFS=`zpool list | sed 1d | awk '{print $1}'`
fi
echo "FS='$UFS $ZFS'" > $CONFFN
fi
. $CONFFN
if [ "$FS" == "" ]; then
echo "Cannot determine file systems."
exit 1
fi
RRDCREATECMD=""
DATA=""
RRDGRAPHCMD=""
NUM=0
for MNTPOINT in $FS; do
NUM=`expr $NUM + 1`
RRDCREATECMD="$RRDCREATECMD DS:T$NUM:GAUGE:600:0:U DS:U$NUM:GAUGE:600:0:U"
DT=`df -k $MNTPOINT | sed 1d | awk '{print $2, $2 - $4}' | sed -e 's/ /:/g'`
if [ "$DATA" != "" ]; then
DATA="$DATA:"
fi
DATA="$DATA$DT"
COLOR="${COLORS[$NUM]}"
RRDGRAPHCMD="$RRDGRAPHCMD DEF:T$NUM=$FN:T$NUM:LAST DEF:U$NUM=$FN:U$NUM:LAST"
RRDGRAPHCMD="$RRDGRAPHCMD CDEF:CT$NUM=T$NUM,1024,* CDEF:CU$NUM=U$NUM,1024,*"
RRDGRAPHCMD="$RRDGRAPHCMD LINE:CT$NUM$COLOR:T_$MNTPOINT LINE:CU$NUM$COLOR:U_$MNTPOINT"
done
if [ ! -f $FN ]; then
rrdtool create $FN \
--step 60 \
$RRDCREATECMD \
"RRA:LAST:0.5:1:1440" \
"RRA:MAX:0.5:60:24"
fi
rrdtool update $FN N:$DATA
rrdtool graph rrdtool_dsk.png \
--start -1d \
--vertical-label "Disk Usage" \
--title "Disk Usage ($HOSTNAME)" \
--width 500 \
--height 100 \
--base 1024 \
--lower-limit 0 \
--rigid \
$RRDGRAPHCMD \
> /dev/null