rrdtools其實是一個基于文件的數據庫,用于數據積累,統計,生成圖片。
1.創建數據庫
rrdtool create usage.rrd DS:cpu:GAUGE:300:0:100 RRA:LAST
DS指定數據源,后面以':'為分隔符接著定義DS的屬性,格式為
DS:ds-name:GAUGE | COUNTER | DERIVE |
ABSOLUTE:heartbeat:min:max
ds-name:數據源的名字,a-zA-Z0-9 。
統計方式:
GAUGE:一般用于普通的統計,如不同時間點的人數。
COUNTER:一般用于持續增加的計數器,計算增加速度。
COMPUTE:一般用于需要對數據做特殊運算處理。
RRA指定數據統計方式,主要有MIN(最小值) , MAX(最大值) , AVERAGE(平均值) , LAST(單點值)。
2.添加數據
rrdtool update usage.rrd [time:value]
3.查看數據
rrdtool fetch
rrdtool dump
4.生成圖片
rrdtool
graph監控cpu和網卡的腳本實例
rrd_init.sh
#!/bin/bash
cd $(dirname $0)
#network
awk -F':' '{if($1~/eth[0123456]$/ && $2 > 0 ) print $1;}' /proc/net/dev | while read if_name
do
if_name=${if_name// }
echo "creating ${if_name}.rrd ..."
/usr/local/rrdtool/bin/rrdtool create ${if_name}.rrd -s 60 DS:rx:COUNTER:120:U:U DS:tx:COUNTER:120:U:U RRA:AVERAGE:0.5:1:1440
done
#disk io
awk '{if($3~/[sh]d[abcdefgh]$/ && $4 > 0 ) print $3;}' /proc/diskstats | while read disk_name
do
disk_name=${disk_name// }
echo "creating ${disk_name}.rrd ..."
/usr/local/rrdtool/bin/rrdtool create ${disk_name}.rrd -s 60 DS:rio:COUNTER:120:U:U DS:wio:COUNTER:120:U:U RRA:AVERAGE:0.5:1:1440
done
#cpu
awk '{if($1~/^cpu/) print $1;}' /proc/stat | while read cpu_name
do
cpu_name=${cpu_name// }
echo "creating ${cpu_name}.rrd ..."
/usr/local/rrdtool/bin/rrdtool create ${cpu_name}.rrd -s 60 DS:idle:COUNTER:120:U:U DS:user:COUNTER:120:U:U DS:iowait:COUNTER:120:U:U DS:i
ntr:COUNTER:120:U:U DS:total:COUNTER:120:U:U RRA:AVERAGE:0.5:1:1440
done
#memory
/usr/local/rrdtool/bin/rrdtool create memory.rrd -s 60 DS:TotalMemory:GAUGE:120:U:U DS:FreeMemory:GAUGE:120:U:U DS:TotalSwap:GAUGE:120:U:U D
S:FreeSwap:GAUGE:120:U:U RRA:AVERAGE:0.5:1:1440
rrd_stat.sh
* * * * * /usr/local/rrdtool/scripts/cpu_rrd_stat.sh > /dev/null 2>&1
#!/bin/bash
cd $(dirname $0)
#network
awk -F':' '{if($1~/eth[0123456]$/ && $2 > 0 ) printf("%s %s\n",$1,$2);}' /proc/net/dev | awk '{printf("%s %d %d\n",$1,$2,$10);}' | while read
if_name if_rx if_tx
do
if_name=${if_name// }
/usr/local/rrdtool/bin/rrdtool update ${if_name}.rrd N:$if_rx:$if_tx
done
#disk io
awk '{if($3~/[sh]d[abcdefgh]$/ && $4 > 0 ) printf("%s %d %d\n",$3,$6,$10); }' /proc/diskstats | while read disk_name disk_rio disk_wio
do
disk_name=${disk_name// }
/usr/local/rrdtool/bin/rrdtool update ${disk_name}.rrd N:$disk_rio:$disk_wio
done
#cpu
awk '{if($1~/^cpu/) {user=$2+$3 ;intr=$7+$8; printf("%s %d %d %d %d %d\n",$1,$5,user,$6,intr,user+$4+$5+$6+intr);} }' /proc/stat | while read
cpu_name cpu_idle cpu_user cpu_iowait cpu_intr cpu_total
do
cpu_name=${cpu_name// }
/usr/local/rrdtool/bin/rrdtool update ${cpu_name}.rrd N:$cpu_idle:$cpu_user:$cpu_iowait:$cpu_intr:$cpu_total
done
awk '{if($1~/^MemTotal/) mem_total=$2;else if($1~/^MemFree/) mem_free=$2;else if($1~/^SwapTotal/) swap_total=$2;else if($1~/^SwapFree/) swap_f
ree=$2;} END{printf("%d %d %d %d\n",mem_total,mem_free,swap_total,swap_free);}' /proc/meminfo | while read mem_total mem_free swap_total swap
_free
do
/usr/local/rrdtool/bin/rrdtool update memory.rrd N:$mem_total:$mem_free:$swap_total:$swap_free
done
rrd_img.sh
*/5 * * * * /usr/local/rrdtool/scripts/cpu_rrd_img.sh > /dev/null 2>&1
#!/bin/bash
cd $(dirname $0)
awk -F':' '{if($1~/eth[0123456]$/ && $2 > 0 ) print $1;}' /proc/net/dev | while read if_name
do
# -y 10:10 -u 100 -l 0 \
if_name=${if_name// }
echo "creating [${if_name}.png] ..."
/usr/local/rrdtool/bin/rrdtool graph "${if_name}.png" \
-s -86400 \
-w 500 -h 100 \
-x MINUTE:30:HOUR:2:HOUR:2:0:%H:%M \
-Y -t "${if_name} traffic" \
DEF:rx=${if_name}.rrd:rx:AVERAGE \
DEF:tx=${if_name}.rrd:tx:AVERAGE \
CDEF:rx_mbps=rx,1,\/ \
CDEF:tx_mbps=tx,1,\/ \
LINE1:rx_mbps#FF0000:"rx(mbps)" \
LINE1:tx_mbps#00FF00:"tx(mbps)"
done
awk '{if($3~/[sh]d[abcdefgh]$/ && $4 > 0 ) print $3;}' /proc/diskstats | while read disk_name
do
disk_name=${disk_name// }
echo "creating [${disk_name}.png] ..."
/usr/local/rrdtool/bin/rrdtool graph "${disk_name}.png" \
-s -86400 \
-w 500 -h 100 \
-x MINUTE:30:HOUR:2:HOUR:2:0:%H:%M \
-Y -t "${disk_name} io" \
DEF:rio=${disk_name}.rrd:rio:AVERAGE \
DEF:wio=${disk_name}.rrd:wio:AVERAGE \
CDEF:rio_sector=rio,1,\/ \
CDEF:wio_sector=wio,1,\/ \
LINE1:rio_sector#00FF00:"rio(sector)" \
LINE1:wio_sector#FF0000:"wio(sector)"
done
awk '{if($1~/^cpu/) print $1;}' /proc/stat | while read cpu_name
do
cpu_name=${cpu_name// }
echo "creating [${cpu_name}.png] ..."
/usr/local/rrdtool/bin/rrdtool graph "${cpu_name}.png" \
-s -86400 \
-w 500 -h 100 \
-x MINUTE:30:HOUR:2:HOUR:2:0:%H:%M \
-Y -t "${cpu_name} usage" \
DEF:idle=${cpu_name}.rrd:idle:AVERAGE \
DEF:user=${cpu_name}.rrd:user:AVERAGE \
DEF:iowait=${cpu_name}.rrd:iowait:AVERAGE \
DEF:intr=${cpu_name}.rrd:intr:AVERAGE \
DEF:total=${cpu_name}.rrd:total:AVERAGE \
CDEF:idle_persent=idle,total,\/,100,\* \
CDEF:user_persent=user,total,\/,100,\* \
CDEF:iowait_persent=iowait,total,\/,100,\* \
CDEF:intr_persent=intr,total,\/,100,\* \
LINE1:idle_persent#00FF00:"idle(%)" \
LINE1:user_persent#0000FF:"user(%)" \
LINE1:iowait_persent#FF0000:"iowait(%)" \
LINE1:intr_persent#FF00FF:"intr(%)"
done
rrd_name="memory"
echo "creating [${rrd_name}.png] ..."
/usr/local/rrdtool/bin/rrdtool graph "${rrd_name}.png" \
-s -86400 \
-w 500 -h 100 \
-x MINUTE:30:HOUR:2:HOUR:2:0:%H:%M \
-Y -t "${rrd_name} usage" \
DEF:TotalMemory=${rrd_name}.rrd:TotalMemory:AVERAGE \
DEF:FreeMemory=${rrd_name}.rrd:FreeMemory:AVERAGE \
DEF:TotalSwap=${rrd_name}.rrd:TotalSwap:AVERAGE \
DEF:FreeSwap=${rrd_name}.rrd:FreeSwap:AVERAGE \
CDEF:TotalMemoryM=TotalMemory,1024,\/ \
CDEF:FreeMemoryM=FreeMemory,1024,\/ \
CDEF:TotalSwapM=TotalSwap,1024,\/ \
CDEF:FreeSwapM=FreeSwap,1024,\/ \
LINE1:TotalMemoryM#00FF00:"TotalMemory(M)" \
LINE1:FreeMemoryM#0000FF:"FreeMemory(M)" \
LINE1:TotalSwapM#FF0000:"TotalSwap(M)" \
LINE1:FreeSwapM#FF00FF:"FreeSwap(M)"
cp *.png ${imgpath}/