2016-07-21 82 views
0

我有一個Python程序,收集探測請求併發送ssids和mac到服務器。但是幾分鐘後它會減慢我的電腦速度。我試圖添加字典,以便我只在需要時進行POST。 但問題仍然如此:幾分鐘後,我的電腦放緩。我也嘗試過覆盆子pi,結果是一樣的。爲什麼我的Python程序減慢我的電腦

請告訴我這裏有什麼問題。

這是代碼

#!/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) 

請告訴我什麼是錯在這裏。

+0

我可能會誤解scapy,但是在循環中添加'sniff'會多次添加處理程序嗎?如果使用'timeout = 100'並且只調用一次'sniff',會發生什麼? –

+0

我找不到很好的'scapy'文檔來告訴我'pkt.info'是什麼,但是它可能在dict裏面列出的信息越來越大。這個例子https://gist.github.com/securitytube/5291959嗅探器過濾到正確的數據包類型befoer節省ssids。也許你應該這樣做。 – tdelaney

回答

1

我相信這是由這一行造成的:

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

正如macSsid [pkt.addr2]變大引用的列表,Python列表上做一個迭代搜索的成本變得非常高。這是一個列表,不是字典,所以沒有索引,python必須按順序檢查每個元素,直到找到匹配元素,或者檢查了列表中的每個元素。

我建議將其更改爲一個字典更快的操作,

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 

而且else子句中添加pkt.info當相應的變化。

更改爲索引類型將允許基於索引的查找,而不是迭代列表。我相信Python中有索引列表類型,但我沒有使用它們,因爲除了索引查找之外,度量標準或類似數據的額外存儲一直是一個好處。

您的用例可能會誇大其效果,因爲我懷疑您將很有可能找不到pkt.info的匹配項,因此每次搜索列表時都必須檢查每個元素在斷定它不存在之前。

考慮將前1000個元素添加到列表中的成本:每個新元素都需要在添加之前搜索上一個集合,僅需要這些新元素的50萬個比較,不包括任何不添加的重複元素。已經存在的元素可能需要檢查比統計均值更多,如果網絡數據包使用順序標識符而不是完全隨機的標識符,這與大多數網絡協議的情況。

還要注意,當清單不再完全適合CPU緩存時,這看起來會突然變慢。此時,根據機器的規格,您的性能通常會從10倍到100倍之間突然下降。

這似乎影響到您的計算機的其餘部分原因是在等待每一個存儲器取操作完成,並不斷內存的讀取操作減慢你的內存控制器,因爲CPU被阻止。運行你的Python程序的核心將完全堵塞,你的內存總線將接近飽和,從而導致其他應用程序似乎慢也。

0

您的程序使用的內存太多。這是因爲你沒有清理你的macSsid字典。如果您在使用它們後刪除條目(使用del),則程序將使用較少的內存,從而停止放慢計算機速度。

+0

感謝您的回答。我曾嘗試使用和不使用字典,問題是一樣的。我的事情(但不知道),這是因爲發佈請求過於頻繁。 – dmx

+0

隨着時間的推移,這不會使您的電腦變慢。如果這不是問題,那麼我不知道是什麼。 – pta2002

+0

無論如何,謝謝你 – dmx

相關問題