Quantcast
Channel: polygun2000的博客
Viewing all articles
Browse latest Browse all 55

如何使用snmp计算接口带宽

$
0
0
作为运维的日常工作,看监控是我们每天都做的事情。突然有点好奇,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流量分开计算,公式如下:

也就是前后取两次接口的流量值相减,然后乘以8,再除以两次取值的时间间隔(以秒为单位),这样得到的是bits/s
可以再除1024的平方,变为Mbits/s。

但是上边的公式并不完善,为什么呢?因为ifHCInOctets是个64bits的计数器,尽管这个数字已经很大了,但在长期使用以后还是会达到最大值,接着计数器会回环,直接清零。那么问题来了,如果刚好前一次和后一次取值的中间,遇到了计数器清零了呢?后一次减一次的值就会是负数。那么这种问题应该怎么处理呢?请参考如下代码:


以上就是如何通过snmp计算接口带宽的方法啦,打完收工。

参考文档:
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

 

Viewing all articles
Browse latest Browse all 55

Trending Articles