我正在尝试使用来自 SNMP 的数据绘制路由器上特定接口的网络使用情况图表。我知道 ifInOctets/ifOutOctets 只有 32 位,在高速下会溢出,使我的图表看起来很愚蠢,但看起来 ifInOctets/ifOutOctets 和 ifHCInOctets/ifHCOutOctets 返回的值之间的差异并不总是相同的。我通过使用snmpwalk | grep InOctets
和减去这些值进行了几次测试。有时我发现 32 位计数器的变化明显小于(超过 50%)64 位版本的变化,有时我看到相反的情况,64 位计数器显示的增量较小。
我是否遗漏了读取 64 位计数器的方法,或者只是它们的数据更新方式有所不同?32 位数字与 /proc/net/dev 中的数字相匹配,因此我更倾向于相信它们,但当速度过高时,包装问题会使它们无法使用:
这里有几个例子,每个 snmpwalk 运行间隔大约 10 秒:
$ snmpwalk -c public -v2c 192.168.1.1 | grep -i InOctets.2
IF-MIB::ifInOctets.2 = Counter32: 2291487255
IF-MIB::ifHCInOctets.2 = Counter64: 2901400127083
$ snmpwalk -c public -v2c 192.168.1.1 | grep -i InOctets.2
IF-MIB::ifInOctets.2 = Counter32: 2297202283
IF-MIB::ifHCInOctets.2 = Counter64: 2901400298056
32 位更改:5715028
64 位更改:170973
$ snmpwalk -c public -v2c 192.168.1.1 | grep -i InOctets.2
IF-MIB::ifInOctets.2 = Counter32: 2297528566
IF-MIB::ifHCInOctets.2 = Counter64: 2901400453366
32 位更改:326283
64 位更改:155310
答案1
RFC 2233 针对高容量接口采用了扩展的 64 位计数器,因为 32 位计数器无法提供足够的容量并且换行速度太快。
答案2
我觉得你不应该跑过去所有的SNMP OID 树,这需要花费大量时间。您可以尝试snmpbulkwalk -c public -v2c 192.168.1.1 InOctets.2
使用snmpbulkwalk -c public -v2c 192.168.1.1 ifHCInOctets.2
吗?但无论如何,这种差异看起来很奇怪。您有其他 SNMP 设备可以比较吗?