我在用着基础工作(基于 Nagios 构建的监控框架)通过 SNMP 监控一些网络设备,但我遇到了带宽使用问题。
大多数路由器(包括此处使用的 Cisco 2800)都可以通过 SNMP 查询网络流量信息;但是,它们以计数器的形式返回此信息,即“自路由器开启以来,有多少字节进出给定接口”。因此,为了从这些信息中获取有意义的信息,您需要每秒查询一次这些信息,并查看每个测量值与前一个测量值的差异。
Groundwork/Nagios 可以自动管理性能数据,因为它们使用 RRD 来存储这些数据,并且 RRD 支持计算值之间的增量。
但是,当带宽使用量超过一定限制时,如何生成警报?Nagios 仅当值超过给定阈值时才发送警报,而不是基于同一值的两个不同测量值之间的差异。
我需要一种方法来检查带宽使用情况是否超过某个阈值,如果发生这种情况,则生成 Nagios 警报(从而发送电子邮件);我不能只依靠管理员查看性能数据来判断网络带宽是否有问题。
答案1
我使用 cron 脚本执行了此操作,将当前值存储在临时文件中,然后下次使用它来计算自上次运行以来的带宽利用率。
#!/bin/bash
email_address=""
router_ip=""
# 80% BANDWIDTH [ (384000bps) 48,000Bps ] - 20% = 38,400 Bps
alertBW="76800"
lastBWFile="/var/log/ciscoGW.log"
lastBW=`cat $lastBWFile | awk '{print$2}'`
lastTime=`cat $lastBWFile | awk '{print$1}'`
curBW=` snmpget -c snmap_name -v 1 $router_ip IF-MIB::ifOutOctets.2 | awk '{print$4}'`
let diffBW=$curBW-$lastBW
#echo "Diff BW: $diffBW"
timeNow=`date +%s`
let diffTime=$timeNow-$lastTime
let alertBW=$alertBW*$diffTime
echo "$timeNow $curBW" > $lastBWFile
if [ $diffBW -gt $alertBW ]; then
# echo "Over limit!"
echo "Bandwith used over $diffTime seconds: $diffBW" | mail -s "BANDWIDTH OVER LIMIT!!!!" $email_address
fi
因为我对实际峰值更感兴趣,所以我开始使用 rrdtool:
#start 15 minutes ago
#end 5 minutes ago since rrdtool queries every 5 minutes
rrdtool fetch $FROM MAX -s -900 -e -300
答案2
为了进行优化,请替换 snmpget -c snmap_name -v 1 $router_ip IF-MIB::ifOutOctets.2 | awk '{print$4}'
by snmpget -O qv -c snmap_name -v 1 $router_ip IF-MIB::ifOutOctets.2
(少启动一个进程)