症状描述
在查看(包括但不限于)RHEL、Dell、F5部分版本/设备的syslog日志时,出现以下日志:
snmpd[XXXX]: truncating integer value > 32 bits
snmpd是SNMP(Simple Network Management Protocol)的守护进程,主要用于监听SNMP请求(比如snmpget或snmpwalk发来的)并返回系统状态信息。出现以上日志的原因是,在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定义。
