如果 SNMP 计数器的值小于以前的读数,绘图工具应该如何表现?
Posted
技术标签:
【中文标题】如果 SNMP 计数器的值小于以前的读数,绘图工具应该如何表现?【英文标题】:How should graphing tool behave in case SNMP counter has smaller value than previous reading? 【发布时间】:2015-08-12 12:10:43 【问题描述】:我正在构建一个小型监控解决方案,并想了解在先前读数大于当前读数的情况下正确/最佳行为是什么。例如ifHCOutOctets
SNMP 对象对从 Cisco 路由器中的接口传输的字节数进行计数。如果此计数器重置回 0(例如由于路由器重新启动),图形应用程序应该如何表现?在我的选择中,以下算法是正确的行为:
if [ ! $prev_val ]; then
# This reading will be used to set the baseline value for "prev_val" variable
# if "prev_val" does not already exist.
prev_val="$cur_val"
elif (( prev_val > cur_val )); then
# Counter value has set to zero.
# Use the "cur_val" variable.
echo "$cur_val"
prev_val="$cur_val"
else
# In case "cur_val" is higher than or equal to "prev_val",
# use the "cur_val"-"prev_val"
echo $(( cur_val - prev_val ))
prev_val="$cur_val"
fi
我还根据上面的算法做了一个小例子图:
交通图是基于此构建的:
reading 1: cur_val=0, prev_val will be 0
reading 2: 0-0=0(0 Mbps), cur_val=0, prev_val will be 0
reading 3: 20-0=20(160 Mbps), cur_val=20, prev_val will be 20
reading 4: 20-20=0(0 Mbps), cur_val=20, prev_val will be 20
reading 5: 50-20=30(240 Mbps), cur_val=50, prev_val will be 50
reading 6: 40(320Mbps), cur_val=40, prev_val will be 40
reading 7: 70-40=30(240 Mbps), cur_val=70, prev_val will be 70
reading 8: no data from SNMP agent
reading 9: 90-70=20(160 Mbps), cur_val=90, prev_val will be 90
在我看来,这个小算法可以正常工作。
如果有什么不清楚的地方请告诉我,我会改进我的问题。
【问题讨论】:
图形应用程序将显示一些增量或传输字节的绝对值? 它需要显示增量。这将是一个带宽(bps)图。 【参考方案1】:我看到的问题是,在正常操作的情况下,计数器会发生变化。路由器重启后,它会显示一些绝对值。现在有办法比较这 2 个。如果你想显示 2 个读数的增量,我建议:
if [ ! $prev_val ]; then
# This reading will be used to set the baseline value for "prev_val" variable
# if "prev_val" does not already exist.
prev_val="$cur_val"
elif (( prev_val > cur_val )); then
# Counter value has set to zero.
# Use the "cur_val" variable.
echo "Router/counter restarted"
# restart the counter as well
prev_val="$cur_val"
else
# In case "cur_val" is higher than or equal to "prev_val",
# use the "cur_val"-"prev_val"
echo $((cur_val-prev_val))
fi
您也可以删除elif
部分并仅打印负值以指示计数器/路由器重新启动
【讨论】:
在实践中如何导致接口计数器不连续?另外,您能否解释一下我为什么要投票ifCounterDiscontinuityTime
?我的意思是我看不到与我最初的问题有任何关联。
据我了解 Cisco SNMP 文档,ifCounterDiscontinuityTime
显示接口计数器重新启动的时间。我怀疑这可能会发生,例如,如果唯一的接口重新启动(shutdown
和no shutdown
命令)或电缆被拔出等。我无法对此进行测试,因为目前我无法访问 Cisco 设备
接口重置是接口被重置的次数。如果接口在三秒内无法传输,则 ASA 会重置接口以重新启动传输。在此间隔期间,将保持连接状态。当接口环回或关闭时,也可能发生接口复位。我找到了这个here
我尝试通过管理方式禁用 ios 中的接口并物理移除电缆,但我无法影响 ifCounterDiscontinuityTime
计数器。但是,我仍然不太明白我应该如何从ifCounterDiscontinuityTime
中受益。最后但同样重要的是,我用一张图更新了我最初的问题。【参考方案2】:
特别是如果样本类型是“Counter32”,则值得考虑计数器的翻转。我不确定这是否是“最佳实践”,但是当您知道您有部分样本时,您还可以推断整个样本中的数据片段,就好像您在整个样本中保持相同的增长率一样。除非您的数据非常突发,否则它应该可以生成更平滑的图表。
partial_calc = $((sample_time - ifCounterDiscontinuityTime));
if ("$interval" -gt "$partial_calc")
sample = $((curr_val * interval / partial_check))
elif "$curr_val" -gt "$prev_val"
sample = $((curr_val - prev_val));
else
if ("$type" -eq "Counter32")
sample = $((4294967295 - prev_val + curr_val));
else
sample = $curr_val;
【讨论】:
以上是关于如果 SNMP 计数器的值小于以前的读数,绘图工具应该如何表现?的主要内容,如果未能解决你的问题,请参考以下文章