作为运维的日常工作,看监控是我们每天都做的事情。突然有点好奇,zabbix,cacti这类软件通过snmp监控流量计算的方法依据是什么呢?于是google一番,得到一些结论。
首先 ,交换机提供的snmp信息中并没有直接的端口带宽,而只有端口上的流量数据。
以下是Cisco在其IF-MIB文件中对于端口接收(IN)流量的定义:
ifHCInOctets
OBJECT-TYPE
SYNTAX
Counter64
MAX-ACCESS
read-only
STATUS
current
DESCRIPTION
"The total number of octets
received on the interface,
including framing characters.
This object is a 64-bit
version of
ifInOctets.
Discontinuities in the value
of this counter can occur at
re-initialization of the
management system, and at other
times as indicated by the
value of
ifCounterDiscontinuityTime."
::= { ifXEntry 6 }
可以看到,这个ifHCInOctets取到的值是"端口收到的octets的总数"。
那么RFC中的Octet这量词是什么呢?继续google,发现octet是指8个二进制位(bit),那么8bits不就是一个Byte吗?为啥不用Byte这个大众化量词呢?
区别是:
Octet 总是表达8个bit,就像他名字所说的。
Byte
通常情况下也表示8个bit,但是准确的说,Byte表示的是CPU可以独立的寻址的最小内存单位(不过通过移位和逻辑运算,CPU也可以寻址到某一个单独的bit)。
曾几何时,有些电脑的寻址单位不是8Bit的。当然,当前来说大多数情况下byte可以和octet等价,但是如果你想要强调准确的8bit时,你就应该使用octet而不是byte。
另外,还有一个量词 nibble用来形容一个字节的一半 (通常是4bit)不过这个词基本上没人用就是了。
然后又google到了Cisco的一篇文档,说明了如何通过端口的流量来计算带宽。
具体可以看参考文档,直接说结论,对于全双工网络建议将IN和OUT流量分开计算,公式如下:
可以再除1024的平方,变为Mbits/s。
但是上边的公式并不完善,为什么呢?因为ifHCInOctets是个64bits的计数器,尽管这个数字已经很大了,但在长期使用以后还是会达到最大值,接着计数器会回环,直接清零。那么问题来了,如果刚好前一次和后一次取值的中间,遇到了计数器清零了呢?后一次减一次的值就会是负数。那么这种问题应该怎么处理呢?请参考如下代码:
参考文档:
1.http://www.cisco.com/c/en/us/support/docs/ip/simple-network-management-protocol-snmp/8141-calculate-bandwidth-snmp.html
2.http://blog.chasefox.net/calculating-ifinoctets/
3.ftp://ftp.cisco.com/pub/mibs/v2/IF-MIB.my
4.http://blog.icybear.net/2009/09/octets-vs-bytes.html
5.http://www.cisco.com/c/en/us/support/docs/ip/simple-network-management-protocol-snmp/26007-faq-snmpcounter.html