少走冤枉路!带你走过SNMP的那些坑

少走冤枉路!带你走过SNMP的那些坑

SNMP(Simple Network Management Protocol)即简单网络管理协议,是在网络与系统监控领域中,最常使用的一种数据采集技术。尽管这个协议非常简单,但在大规模IT环境监测中,还是经常会碰到各种坑,因此优云开源了一套友好的SNMPAPI,并通过本文简单介绍这套API中的一些特点,希望帮助各位运维同仁提前规避一些问题。

特点[0]. 提供解析各种数据类型的SnmpValue类

在SNMP中,有各种各样的数据类型,光表达数值类型的,就有Gauge32、Integer32、Counter32、Counter64等数十种,甚至有一种称为OctetString的万能数据类型,可以代表常见的ASCII字符串、IP地址、MAC地址、端口列表等等含义。很多老手都经常由于错误的转换OctetString,导致采用到的数据没有意义,更别提新手面对这些数据类型,会有多糊涂了。

本API所返回的采集结果,均使用SnmpValue类,对各种原数据类型进行了统一封装,提供了更友好的使用接口,如下所示:

 2.jpg


特点[1].提供避免死循环的Walk操作


Walk操作是指不断使用Get-Next请求去逐个采集设备的一些相邻OID,以获取一批相关信息的操作。

 

从SNMP规范上来说,设备上的OID排列应该是升序并且不会重复,但林子大了,什么鸟都有!一些OID出现逆增长甚至干脆重复的设备也会出现。因此程序员写出会死循环的Walk操作也很常见。

 

而本API提供的三个特性可以避免这种情况出现:

 

·兼容OID逆增长

·自动合并重复OID,保留同一个OID采集到的最后一次值

·允许设置单次Walk最大结果数,避免死循环

 

特点[2]. 提供Table数据类型与WalkTable操作


Walk操作很多时候都是在采集设备的表格类信息,如端口列表、路由表、转发表等。

但在使用普通的Walk操作时,返回的只是一个一维数组,每个元素只对应到表格中的一个单元格。因此为了从中完整的提取出一个路由记录、端口信息,往往要需要不停的遍历数组,根据OID与Index提取元素。同时由于设备的表格也可能在Walk过程中发生了改变,有时也会碰到缺失某些单元格的情况,无法组织起有效数据的情况。

因此,如果使用传统的方法来提取信息,一般会写出如下复杂的代码:

少走冤枉路!带你走过SNMP的那些坑

而使用本API中的walkTable与Table数据类型,可以大大的简化相关操作。

少走冤枉路!带你走过SNMP的那些坑

特点[3]. 合并pdu发出多个requestoid,大幅度提高性能

在进行SNMP采集时,往往会出现大量的SNMP请求,这是因为进行Walk时,需要产生大量的Get-Next操作。

举例来说,采集一个拥有48个端口的设备端口表,则需要的请求数为:

 

> 48(端口数) * 22(每端口字段数) =1056次请求

而本API,在设计时考虑到了减少请求的需求,会尝试将一行多个字段的OID请求合并到一次请求中,以大幅度减少需要发出的数据包数量。

 

同样采集一个48个端口,其需要的请求数为:

> 48(端口数) * 1(合并后的请求数) =48次请求

可见减少了96%的请求。

 

特点[4]. 控制SNMP采集频率,避免被管设备CPU飙升


最后,由于一些网络设备较为陈旧,其采用的CPU性能较弱,以及厂商的SNMP Agent存在性能缺陷,因此在实际的SNMP采集操作时,常经常会出现CPU利用率持续在100%,更有甚者开始出现网络数据丢包,影响正常数据转发功能的情况。

 

本API默认对访问频繁进行了50ms的最低频率控制,并且此参数也可按被采集的设备进行单独调整,因此可有效避免SNMP采集对设备的不利影响。

 

除上述特点外,此套开源类库,还提供了诸如“OID联合与父子判断”、“异常简化”、“V3参数简化”、“Table缺失容错”等优秀特性,欢迎大家使用与进一步补充功能。

 

福利在这里哦:本文涉及代码均已开源在:https://github.com/uyun/common-snmp,同时优云也会陆续开源一些运维工具项目,如监控采集代理等。优云是一家致力于通过技术帮助企业提升运维效益的公司。

 

作者介绍  蒋君伟 任职优云软件(秉承devops的理念,从监控、到应用体验,到自动化持续交付,全栈运维解决方案服务商)

原创文章,作者:uyunops,如若转载,请注明出处:http://www.178linux.com/18261

(0)
uyunopsuyunops
上一篇 2016-06-22 15:42
下一篇 2016-06-22 15:46

相关推荐

  • 简述计算机网络数据链路层

    数据链路层    数据链路层是什么?      数据链路层工作在七层网络模型的第二层,它定义了在单个链路上如何传输数据。 数据链路层:是为了提供功能上和规程上的方法,以便建立、维护和释放网络实体间的数据链路 。 物理链路(物理线路):是由传输介质与设备组成的。原始的物理传输线路是指没有采用高层差错控…

    Linux干货 2017-05-15
  • 设计模式 ( 十二 ) 职责链模式(Chain of Responsibility)(对象行为

    1.概述        你去政府部门求人办事过吗?有时候你会遇到过官员踢球推责,你的问题在我这里能解决就解决,不能解决就推卸给另外个一个部门(对象)。至于到底谁来解决这个问题呢?政府部门就是为了可以避免屁民的请求与官员之间耦合在一起,让多个(部门)对象都有可能接收请求,将这些(部门)对象连接成一条链,并且沿着这条链传递…

    Linux干货 2015-07-15
  • Linux系统压缩和解压缩工具gzip、bzip2、xz以及tar打包工具总结

    在Linux系统使用过程中,对于一些不是常用的文件,利用cpu的时间资源对文件进行压缩可以节省一定的磁盘空间,对系统中某个目录经常会有备份的需求,可以使用Linux系统中的tar打包工具实现,文件的压缩对于大量的网络文件传输可以节约带宽,同时也能降低服务器的负载,我们经常需要从网站下载软件包到本地主机,这些包基本都是打包压缩的,要想使用安装,需要我们解压缩他…

    Linux干货 2016-08-18
  • Shell脚本编程—数组、字符串处理

    数组 变量:存储单个元素的内存空间 数组:存储多个元素的连续的内存空间     数组名:整个数组只有一个名字;     数组索引:编号从0开始;          [数组名索引]  &nbs…

    Linux干货 2016-08-30
  •  编译安装步骤     大致过程:(源代码–预处理–编译–汇编–链接–执行)   第一步 下载安装开发工具“Development toos” 第二步 下载解压源代码包 仔细阅读“Install和 Read me” 第三步 使用./conf…

    Linux干货 2017-04-24
  • sed命令的用法和vim编辑器的使用

    一、文本处理工具sed sed [option]….'script] [input-file]… 简介: sed是一种流编辑器,他一次处理一行的内容,处理时把当前处理的行存储在临时缓冲区中,这个缓冲区被称为模式空间,接着用sed命令处理,处理完成后把模式空间的内容送往屏幕,接着处理下一行,知道文件末尾,而文件的内容…

    Linux干货 2016-08-15

评论列表(1条)

  • stanley
    stanley 2016-06-22 15:45

    有硬货的软广我们也支持