设计无止境,还要多努力

本文分享了作者在C++采集器代码优化过程中的心得,包括如何通过改进设计提升程序的扩展性和性能,特别是在处理复杂逻辑和不同设备数据时的策略。
 
      自己最近一直在整理C++写的采集器代码,主要两个方面的改动:
    •  程序易于扩展
    •   性能调优
    感慨设计无止境,现将设计的修改列在如下,全当总结或设计不全的教训。
       一、原始设计
         工作多年,知道设计的重要性,我在设计上下了很大的功夫,当时设计就考虑到采集器需要收集不同设备厂家不同型号的设备数据。于是,我使用xml配置文件记录采集的snmp oid:如
   <CURRATTAINABLERATEUP type="oid" value="1.3.6.1.2.1.10.94.1.1.3.1.8.a_ifIndex" /> 
其中a_ifIndex是采集对应端口的ifIndex,而对应的ifIndex的取值又通过同一个配置文件的得到如:
     <a_ifIndex name="a_ifIndex" type="condition" value="1.3.6.1.2.1.2.2.1.1.?">
            <condition name="ifDescr" type="like" value="1.3.6.1.2.1.2.2.1.2.?" like="Adsl?/?/?">ifDescr</condition>
        </a_ifIndex>
我使用了类似的正则表达式的规则,使用like操作通过读取ifDescr的值来计算ifindex的值。
     由于上层需要的值并不一定是底层采集的值,需要进行一定的逻辑运算或数学运算,于是有了诸如:
    • transfer
    • compute
    • condition
    • append
    • avg
    • sum
    • plus
       通过对oid值和一些常量的逻辑运算来得到上层的值。这样的设计使的程序可以依赖这些逻辑运算来做任意组合计算的值。例如新添加一个采集项,只需修改配置的文件,增加一个有一定运算的任务,而无需改动任何代码。易用性和扩展性得到很大的提供。
     二、一次性能调优导致的设计变动
        由于采集设备的指标很多,有近70个,而且各个指标都有一个以上的oid值的采集。开始程序是一个指标和设备通讯一次,采集需要的数据,断开连接。这样耗时较大,所以在现场使用的过程中进行优化,考虑大部分的操作时snmp get ,而且snmp get一次可以得到多个oid的值,所以引入了一个snmp缓存类,记录所有需要采集的oid的值,通过几次get操作就可以得到所有的oid的值,然后,再对每个指标读取snmp缓存oid值,计算得到上层所需要的值。这样效率得到极大的提高,所花的时间也变成原来的10分之一。
     三、 支持特殊情况的设计变动
       对于不同的设备,其ifindex的取值是不一样的,同时一些设备的私有mib计算不能或很难通过运算法则来计算得到,所以就需要用提供一种很方便的插入具体的代码(类似于逻辑运算)来计算上面的提到的值,当前的设计是提供一个接口,每次当有新的指标需要额外处理的指标的话,就继承这个接口,实现对应的方法,这样只在程序中加入if(type == "new operator type "),然后调入方法即可,其实这步都可以省的,使用动态创建的技术,但是考虑到那样做要使用新技术,而且增加程序的易读性,目前先这样。 
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值