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

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

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

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

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

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

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

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

·兼容OID逆增长

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

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

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

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

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

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

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

特点[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缺失容错”等优秀特性,欢迎大家使用与进一步补充功能。

作者介绍  蒋君伟 任职优云软件

·IT运维资深实践者;

·研发成果:网络管理、系统管理、CMDB、ITSM等产品,并成功建设了多个全国性的网络运维管理项目;

·实践项目:开源社区技术推广、实现SNMP协议栈、研究去中心化大规模集群技术。

少走冤枉路!带你走过SNMP的那些坑的更多相关文章

  1. 根据实践经验,讲述些学习Java web能少走的弯路,内容摘自java web轻量级开发面试教程

    在和不少比较上进的初级程序员打交道的过程中,我们总结出了一些能帮到合格程序员尽快进阶的经验,从总体上来讲,多学.多实践不吃亏.本文来是从 java web轻量级开发面试教程从摘录的. 1  哪些知识点 ...

  2. 跟哥走,带你玩转Surface 2

    以为自己是数码控?觉得自己买了Surface就无所不能?别逗了!来看哥怎么玩平板,也让你们这些小虾米看看,什么才叫“玩转”! 新技能Get:密码不在用键盘 什么?每次开机你还要输入一长串密码?都什么年 ...

  3. Android中RecyclerView用法,一步一步教你如何使用RecyclerView以及带你走过编码中可能会出现的坑~

    首先,要明白RecyclerView是做什么的?其次是为什么要用RecyclerView?这里牵扯到RecyclerView和ListView的区别,这里不废话,大家自行百度即可! 以下示例我用的An ...

  4. Spring Boot 整合多点套路,少走点弯路~

    持续原创输出,点击上方蓝字关注我 个人原创博客+1,点击前往,查看更多 目录 前言 Spring Boot 版本 找到自动配置类 注意@Conditionalxxx注解 注意EnableConfigu ...

  5. 老王带你走过 Kafka 入门教程

    Apache Kafka是分布式发布-订阅消息系统,在 kafka官网上对 kafka 的定义:一个分布式发布-订阅消息传递系统. 它最初由LinkedIn公司开发. Linkedin于2010年贡献 ...

  6. url带#号,微信支付那些坑

    现在前端很多框架的前端路由都带#号,主要为了做到无刷新跳转页面. 在微信公众号做微信支付时,配置的支付路径比如是http://www.eee.com/#/order,在调微信支付的方法时错误信息是'U ...

  7. 走过的easyui的坑--datagrid的reload在IE下未刷新

    至于为什么要进easyui这个坑,就不多说了. 我现在使用的是1.5这个版本,在用它做一个后台管理系统,项目做到一半,才想起记录这些坑. 1.对于datagrid在reload.load在IE下未刷新 ...

  8. 关于DateTime自带的AddSeconds等函数的坑

    在此记录一下今天在写一个进程查杀小程序时碰到的关于DateTime的问题:  第一次是用AddSeconds后的时间直接和DateTime.Now做相等判断. class Program { stat ...

  9. 走过的laravel-admin 的坑

    一.http://laravel-admin.org/docs/#/zh/  大家可以根据这个安装1.5 版本的laravel后台管理, 他很方便哦,有很多方法他都自己自己封装了. 二.大家如果想好好 ...

随机推荐

  1. JavaScript DOM 第3章 DOM

    3.4.5 获取元素 1. getElementById DOM提供了一个名为getElementById的方法,这个方法将返回一个与那个有着给定的id属性值的元素节点对应的对象. 文档中的每个元素都 ...

  2. c++ json cpp

    一 编译链接 1 在相应官网下载jsoncpp 2 解压得到jsoncpp-src-0.5.0文件 3 打开jsoncpp-src-0.5.0 -> makefiles -> vs71 - ...

  3. 桥接模式(bridge pattern)-------结构型模式

    桥接模式是一种对象结构型模式,其将抽象部分和它的实现部分分离,使它们都可以独立的变化,又称为柄体(Handle and Body)模式或接口(Interface)模式. 优点: 1.分离抽象接口及其实 ...

  4. Spark-Hadoop、Hive、Spark 之间是什么关系?(转)

    大数据本身是个很宽泛的概念,Hadoop生态圈(或者泛生态圈)基本上都是为了处理超过单机尺度的数据处理而诞生的.你可以把它比作一个厨房所以需要的各种工具.锅碗瓢盆,各有各的用处,互相之间又有重合.你可 ...

  5. JavaScript 中的执行上下文和调用栈是什么?

    http://zcfy.cc/article/what-is-the-execution-context-amp-stack-in-javascript-by-david-shariff-4007.h ...

  6. SDUT -refresh的停车场(栈和队列)

    题目描写叙述  refresh近期发了一笔横財,开了一家停车场.因为土地有限,停车场内停车数量有限,可是要求进停车场的车辆过多. 当停车场满时,要进入的车辆会进入便道等待.最先进入便道的车辆会优先 进 ...

  7. 批处理bat文件dos命令实现文件的解压缩

    ::========压缩文件======================= ::将源路径“C:\Users\xcc\Desktop\多大的经济 ”路径下的文件压缩到目标路径下“D:\迅雷下载\压缩.r ...

  8. [转载]SQL truncate 、delete与drop区别

    相同点: 1.truncate和不带where子句的delete.以及drop都会删除表内的数据. 2.drop.truncate都是DDL语句(数据定义语言),执行后会自动提交. 不同点: 1. t ...

  9. C语言之选择结构

    该章内容:本章我们学习三大结构之一:选择结构,采用选择结构来解决问题称为判断问题,它的求解规则是在不同的条件下进行不同的操作.选择结构比顺序结构要复杂一些.本章是考试的重点章节. 学习方法:先了解选择 ...

  10. Android 判断是否是Rtl

    第一种方法: private boolean isRtl() { return TextUtils.getLayoutDirectionFromLocale(Locale.getDefault()) ...