把简单程序改造成支持timeit测试的格式。
使用实验室的cisco26进行测试。
#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-
# GET Command Generator
#同步方式的snmpget性能测试
from pysnmp.entity.rfc3413.oneliner import cmdgen
def snmpget():
errorIndication, errorStatus, errorIndex, varBinds = cmdgen.CommandGenerator().getCmd(
#0代表v1,1代表v2c
cmdgen.CommunityData('my-agent', 'public', 1),
cmdgen.UdpTransportTarget(('192.168.6.87', 161)),
'1.3.6.1.2.1.1.7.0'
)
print str(varBinds[0][1]);
def runit(loop=1):
for i in range(loop):
snmpget()
#print i
if __name__ == "__main__":
runit(loop=1)
E:\work\python\snmp>c:\python25\python.exe c:\Python25\lib\timeit.py -s "import
snmpgetperf" snmpgetperf.runit()
10 loops, best of 3: 51.8 msec per loop
E:\work\python\snmp>c:\python25\python.exe c:\Python25\lib\timeit.py -s "import
snmpgetperf" snmpgetperf.runit(10)
10 loops, best of 3: 537 msec per loop
E:\work\python\snmp>c:\python25\python.exe c:\Python25\lib\timeit.py -s "import
snmpgetperf" snmpgetperf.runit(100)
10 loops, best of 3: 7.7 sec per loop
单次get在50ms左右,100次get要7.7s
这个速度确实很慢。
对比一下perl的测试程序,100次get只要2.3s
#!/usr/local/bin/perl
#testsnmpwalk.pl
use strict;
use Net::SNMP;
use Time::HiRes qw(time);
unshift (@INC,"/nms/lib");
require ("SnmpUtil.pl");
my ($ip,$comm,$oid);
my $ArgNum = scalar(@ARGV);
if ($ArgNum == 0){
print "[error]usage:testsnmp.pl ip commu oid [version].\n";
$ip="192.168.6.87";
$comm="public";
$oid=".1.3.6.1.2.1.1.7";
}
else{
$ip=$ARGV[0];
$comm=$ARGV[1];
$oid=$ARGV[2];
}
my $loopnum=5;
my $Mib;
my @Index;
my @Oids=($oid);
my $DevColInfo;
$DevColInfo->{'LoopAddress'}=$ip;
$DevColInfo->{'SNMPCommunity'}=$comm;
$DevColInfo->{'SnmpVersion'}="v1";
my $CurValueRef={};#初始化参考变量
my $SnmpTimeOut=2;
my $SnmpRetry=1;
my $sec1=time();
for (my $i=0;$i<$loopnum;$i++){
my $SNMPSess = &CreateSnmpSession_ext($Mib,$DevColInfo,$SnmpTimeOut,$SnmpRetry,$CurValueRef);
if (!defined($SNMPSess)){
my $Detail="Create SNMP session failed: [$DevColInfo->{'LoopAddress'},$DevColInfo->{'SNMPCommunity'}].\n";
}
my ($Error,@Result) = &SnmpGet($SNMPSess,$Mib,0,@Oids);
#print("$Result[0].\n");
}
my $sec2=time()-$sec1;;
print "total $sec2.\n";