Как я могу контролировать скорость, с которой генерируются витые события - PullRequest
0 голосов
/ 18 апреля 2019

Я пишу Python для сканирования SNMP с использованием Twisted и pysnmp. Код работает (Yay!) При сканировании сети, которая маршрутизируется, но непостоянно выдает ошибку при сканировании в подсети, в которой находится мое устройство dev.

Множество тестов подтвердили, что при сканировании маршрутизируемых сетей размером до / 21 (2048 адресов) ошибок не возникает. Но при сканировании моей локальной подсети я получаю ошибку. Локальная подсеть - это / 23 (512 адресов), но эта ошибка противоречива, потому что, если я ограничиваю сканирование подмножеством локальной сети, я иногда могу успешно сканировать его как / 24 (256) или / 25 (128), но не всегда , Эти размеры также иногда вызывают ошибку.

Вот соответствующий код:

from twisted.internet.defer import DeferredList
from twisted.internet.task import react
from pysnmp.hlapi.twisted import *
import ipaddress



def getsystem(reactor, snmpengine, hostname, varBinds):

        d = getCmd(snmpengine,
                   CommunityData('communityname', mpModel=0),
                   UdpTransportTarget((hostname, 161)),
                   ContextData(),
                   varBinds)
        d.addCallback(success, hostname).addErrback(failure, hostname)
        return d


def getall(reactor, hostnames):
    snmpengine = SnmpEngine()
    test = reactor.getThreadPool
    print(counter)
    return DeferredList(
        [
        getsystem(reactor, snmpengine, hostname, ObjectType(ObjectIdentity('SNMPv2-MIB', 'sysDescr', 0)))
        for hostname in hostnames
        ]
    )


network = ipaddress.ip_network('10.10.16.0/21', strict=False)

hosts = []
for addr in network.hosts():
    hosts.append(str(addr))


react(getall, [hosts])

Последняя ошибка, которую я получаю, ниже, я могу предоставить весь трекбек, если это будет полезно. Я понял, что хотя мне нужно уметь ловить эти ошибки и обрабатывать их, что мне нужно делать, чтобы не перегружать сеть или стек SNMP конкретного устройства, мне действительно нужно иметь возможность ограничить количество ожидающих вызовов. Мне нужно будет делать это динамически, поэтому я не хочу, чтобы что-то столь тупое, как «сон на столько микросекунд», я предпочел бы иметь возможность подсчитывать невыполненные запросы и затем ограничивать их на основе этого.

"pysnmp.carrier.error.CarrierError: Искривленное исключение: [Errno 11] Ресурс временно недоступен, из-за: [Errno 11] Ресурс временно недоступен"

...