疑难杂症 / 网络工程 · 6 8 月, 2025 0

设备运行时间超过497天导致snmpd输出“32bits”日志

症状描述

在查看(包括但不限于)RHEL、Dell、F5部分版本/设备的syslog日志时,出现以下日志:

snmpd[XXXX]: truncating integer value > 32 bits

snmpd是SNMP(Simple Network Management Protocol)的守护进程,主要用于监听SNMP请求(比如snmpgetsnmpwalk发来的)并返回系统状态信息。出现以上日志的原因是,在snmpd响应SNMP请求时,某个SNMP OID返回了一个大于32位的整数值,而当前使用的SNMP工具、代理或MIB定义只支持32位整数,所以被截断了高位(丢失了部分数据)。

如果snmpd平时一直运行良好,突然有一天输出上述日志,而重启后不再输出,那么有可能是因为设备运行超过了497天导致的。

为什么是497天?

SNMP在轮询记录系统运行时间的MIBhrSystemUptime(在某些设备上,也可能是agentInventoryUnitUpTime或其他)时,如果MIB文件定义该MIB的数据类型为“Counter32”,则意味着:

  • 设备在收到SNMP请求后只返回32位的数值。
  • 32位二进制数的能表示的最大十进制值是2^32-1=4,294,967,295,用来表示时间即约497天
  • 超过497天后数据溢出,snmpd输出日志。

这里需要说明的是,MIB对象表示系统时间的单位一般为“TimeTicks”,即0.01秒(不是毫秒!)。转换成天数需要进行换算:

days = 4294967295 / 100 / 3600 / 24 = 497.1026963

有没有别的原因?

从上述说明也能够看出,只要MIB文件定义的数据位数短于MIB对象实际的位数,则都有可能输出该日志。如果是用于像网络流量这样的监控计量,则该问题将严重影响计量准确性,应立即处理,使用正确的MIB定义。