2016-07-21 16 views
0

Ich habe ein kleines Programm in Python, die Probe Anfragen sammeln und SSIDs und Macs an einen Server senden. Aber es verlangsamt meinen Computer nach wenigen Minuten. Ich habe versucht, dict hinzuzufügen, so dass ich einen POST nur machen werde, wenn es notwendig ist. Aber das Problem ist immer noch das gleiche: nach ein paar Minuten wird mein Computer langsamer. Ich habe es auch mit Raspberry Pi versucht und das Ergebnis ist das gleiche.Warum mein Python-Programm verlangsamt meinen Computer

Bitte sagen Sie mir, was hier falsch ist.

Dies ist der Code

#!/usr/bin/env python 
from scapy.all import * 
import json 
import requests 


macSsid = {} 
def handler(pkt): 
    url = 'http://10.10.10.10:3000/ssids' 
    headers = {'content-type': 'application/json'} 
    if pkt.haslayer(Dot11): 
     if pkt.type == 0 and pkt.subtype == 4: 
     if pkt.info : 
      print "Client MAC = %s probe request =%s" % (pkt.addr2, pkt.info) 
      if pkt.addr2 not in macSsid: 
       macSsid[pkt.addr2] = [] 
       macSsid[pkt.addr2].append(pkt.info) 
       r = requests.post(url, data = json.dumps({"mac": pkt.addr2, "ssid": pkt.info }), headers = headers) 
      else: 
       if pkt.info not in macSsid[pkt.addr2]: 
        macSsid[pkt.addr2].append(pkt.info) 
        r = requests.post(url, data = json.dumps({"mac": pkt.addr2, "ssid": pkt.info }), headers = headers) 


while 1: 
    try: 
     exc_info = sys.exc_info() 
     sniff(iface="mon0", prn = handler) 
    except Exception, err: 
     traceback.print_exception(*exc_info) 

Bitte sagen Sie mir, was hier nicht stimmt.

+0

Ich mag Scapy missverstehen, aber fügt das Hinzufügen von "Sniff" in einer Schleife den Handler mehrmals hinzu? Was passiert, wenn Sie 'timeout = 100' verwenden und nur einmal' sniff' aufrufen? –

+0

Ich kann keine gute 'Scapy'-Dokumentation finden, die mir sagt, was' pkt.info' ist, aber es ist wahrscheinlich, dass Ihre Informationslisten innerhalb des Diktats sehr groß werden. Dieses Beispiel https://gist.github.com/securitytube/5291959 Sniffer filtert bis zum richtigen Pakettyp vor dem Speichern von SSIDs. Vielleicht solltest du das Gleiche tun. – tdelaney

Antwort

1

Ich glaube, es durch diese Linie verursacht wird:

if pkt.info not in macSsid[pkt.addr2]: 

Da die Liste referenziert von macSsid [pkt.addr2] größer wird, sind die Kosten für eine Python-Liste eine iterative Suche zu tun, sehr hoch wird. Dies ist eine Liste, kein Wörterbuch, daher gibt es keinen Index, und Python muss jedes Element der Reihe nach überprüfen, bis entweder das passende Element gefunden wird oder jedes Element in der Liste überprüft wurde.

ich es in ein Wörterbuch für schnelleren Betrieb empfehlen Wechsel

macSsid[pkt.addr2] = {} 
    macSsid[pkt.addr2][pkt.info] = 1 # the 1 is just a placeholder, 
    # so if you want to store e.g. a repeat count, this would allow it 

und die entsprechende Änderung, wenn pkt.info in der else-Klausel hinzugefügt wird.

Wenn Sie in einen indizierten Typ wechseln, werden Index-basierte Suchen ermöglicht, anstatt die Liste zu durchlaufen. Ich glaube, dass es in Python indizierte Listentypen gibt, aber ich benutze sie nicht sehr, da der zusätzliche Speicher für Metriken oder ähnliche Daten immer zusätzlich zu den indizierten Lookups von Vorteil war.

Ihr Anwendungsfall übertreibt wahrscheinlich auch den Effekt, da ich vermute, dass Sie eine hohe Wahrscheinlichkeit haben, keine Übereinstimmung für die pkt.info zu finden, und deshalb jedes Mal, wenn es die Liste durchsucht, es überprüfen muss jedes Element vor der Schlussfolgerung, dass es nicht existiert. Geben Sie die Kosten für das Hinzufügen der ersten 1000 Elemente zu einer Liste an: Jedes neue Element erfordert das Durchsuchen des vorherigen Satzes vor dem Hinzufügen, wobei für diese neuen Elemente eine halbe Million Vergleiche erforderlich sind, ohne wiederholte Elemente, die Sie nicht hinzufügen . Elemente, die bereits vorhanden sind, könnten mehr als das statistische Mittel erfordern, wenn die Netzwerkpakete sequenzielle Kennungen anstelle von vollständig zufälligen Kennungen verwenden, was bei den meisten Netzwerkprotokollen der Fall ist.

Beachten Sie auch, dass dies an dem Punkt, an dem die Liste nicht mehr vollständig in den CPU-Cache passt, plötzlich zu verlangsamen scheint. An diesem Punkt wird Ihre Leistung normalerweise plötzlich um 10x bis 100x sinken, abhängig von den technischen Daten Ihres Computers.

Der Grund dafür, dass sich dies auf den Rest Ihres Computers auswirkt, liegt daran, dass die CPU während des Wartens auf den Abschluss der Speicherabrufoperation blockiert ist und die konstanten Speicherabrufvorgänge den Speichercontroller verlangsamen. Der Kern, der Ihr Python-Programm ausführt, wird vollständig blockiert, und Ihr Speicherbus wird fast gesättigt sein, wodurch andere Anwendungen ebenfalls langsam erscheinen.

0

Ihr Programm verwendet zu viel Speicher. Dies liegt daran, dass Sie Ihr macSid-Wörterbuch nicht löschen. Wenn Sie die Einträge löschen, nachdem Sie sie verwendet haben (unter Verwendung von del), wird Ihr Programm weniger Speicherplatz verbrauchen und damit Ihren Computer nicht langsamer machen.

+0

Danke für Ihre Antwort. Ich habe es mit und ohne Diktat versucht und das Problem ist das gleiche. Ich weiß (aber nicht sicher), weil Post-Anfrage zu oft gemacht wird. – dmx

+0

Das würde Ihren Computer im Laufe der Zeit nicht verlangsamen. Wenn das nicht das Problem ist, dann weiß ich nicht was ist. – pta2002

+0

danke trotzdem – dmx

Verwandte Themen