如果 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 显示接口计数器重新启动的时间。我怀疑这可能会发生,例如,如果唯一的接口重新启动(shutdownno 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 计数器的值小于以前的读数,绘图工具应该如何表现?的主要内容,如果未能解决你的问题,请参考以下文章

在 DataFlow 中获取以前的窗口数据

matlab绘图工具

Semaphore 信号量

Zabbix SNMP 接口不定期丢数据/绘图不连续问题解决

按下按钮时从 STM32 ADC 获取读数

窗口标题 GLFW 中的 FPS 计数器