[英]SNMP reading from an OID with three libraries gives different execution times
我已經使用easysnmp
讀取SNMP OID,但是現在選擇pysnmp
庫是因為easysnmp
在easysnmp
中不支持asyncio
體系結構 。
考慮的問題是, pysnmp
的速度比其他庫慢:
from pysnmp.hlapi import *
import time
t = time.time()
iterator = getCmd(SnmpEngine(),
CommunityData('public'),
UdpTransportTarget(('192.168.1.120', 161)),
ContextData(),
ObjectType(ObjectIdentity("1.3.6.1.2.1.33.1.2.7.0")))
errorIndication, errorStatus, errorIndex, varBinds = next(iterator)
if errorIndication: # SNMP engine errors
print(errorIndication)
else:
if errorStatus: # SNMP agent errors
print('%s at %s' % (
errorStatus.prettyPrint(),
varBinds[int(errorIndex)-1] if errorIndex else '?'))
else:
for varBind in varBinds: # SNMP response contents
print(' = '.join([x.prettyPrint() for x in varBind]))
print(time.time() - t, 's')
日期:
SNMPv2-SMI::mib-2.33.1.2.7.0 = 21
0.15317177772521973 s
from easysnmp import snmp_get
import time
if __name__ == '__main__':
t = time.time()
response = snmp_get(
'1.3.6.1.2.1.33.1.2.7.0', hostname='192.168.1.120',
community='public', version=1
)
print(response.value)
print(time.time() - t, 's')
日期:
21
0.0063724517822265625 s
func elapsed(what string) func() {
start := time.Now()
fmt.Println("start")
return func() {
fmt.Printf("%s took %v\n", what, time.Since(start))
}
}
func snmpRead() {
g.Default.Target = "192.168.1.120"
err := g.Default.Connect()
if err != nil {
log.Fatalf("Connect() err: %v", err)
}
defer g.Default.Conn.Close()
oids := []string{"1.3.6.1.2.1.33.1.2.7.0"}
result, err2 := g.Default.Get(oids) // Get() accepts up to g.MAX_OIDS
if err2 != nil {
log.Fatalf("Get() err: %v", err2)
}
for i, variable := range result.Variables {
fmt.Printf("%d: oid: %s ", i, variable.Name)
switch variable.Type {
case g.OctetString:
fmt.Printf("string: %s\n", string(variable.Value.([]byte)))
default:
fmt.Printf("number: %d\n", g.ToBigInt(variable.Value))
}
}
}
func main() {
defer elapsed("snmp")()
snmpRead()
}
日期:
start
0: oid: .1.3.6.1.2.1.33.1.2.7.0 number: 21
snmp took 3.668148ms
比pysnmp
快30 pysnmp
我需要在asyncio
中按 go-routine
填充asyncio
的異步性能。
所以,這意味着我應該從pysnmp
遷移到gosnmp
嗎?
請記住,相對於后續調用,第一次pysnmp調用可能要花費更多時間。 由於延遲導入,索引編制,可能的MIB編譯等。
因此,如果您的用例是從同一過程發出許多SNMP查詢,則建議在測量所用時間時考慮到這一點。
另一件事是,最新的(未發布的)pysnmp通過低級SNMP例程引入了異步綁定,即不包括SNMP引擎及其涉及的所有繁瑣的機制。
從簽名角度來看, pysnmp.hlapi.v1arch.asyncio
API的目的與pysnmp.hlapi.v3arch.asyncio
非常相似,但是應該更快,但要以不支持SNMPv3為代價。 如果需要,MIB支持仍然存在。
當僅導入pysnmp.hlapi.asyncio
,您將有效地獲取pysnmp.hlapi.v3arch.asyncio
,因此要獲得v1arch
,需要顯式導入。
例如,以下腳本(在GitHub 主站 pysnmp下運行)可能會更快:
import asyncio
from pysnmp.hlapi.v1arch.asyncio import *
@asyncio.coroutine
def run():
snmpDispatcher = SnmpDispatcher()
iterator = getCmd(
snmpDispatcher,
CommunityData('public'),
UdpTransportTarget(('192.168.1.120', 161)),
('1.3.6.1.2.1.33.1.2.7.0', None)
)
errorIndication, errorStatus, errorIndex, varBinds = yield from iterator
if errorIndication:
print(errorIndication)
elif errorStatus:
print('%s at %s' % (
errorStatus.prettyPrint(),
errorIndex and varBinds[int(errorIndex) - 1][0] or '?'
)
)
else:
for varBind in varBinds:
print(' = '.join([x.prettyPrint() for x in varBind]))
snmpDispatcher.transportDispatcher.closeDispatcher()
asyncio.get_event_loop().run_until_complete(run())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.