Почему мой Ubuntu зависает после запуска скрипта Python? - PullRequest
0 голосов
/ 06 января 2019

Я написал простой скрипт, который вычисляет пропускную способность моей сети. Я использовал библиотеку scapy, чтобы прослушивать весь входящий трафик и вычислять скорость. Вот мой код, который отслеживает трафик:

from time import sleep
from threading import Thread, Event
from scapy.all import *

class Sniffer(Thread):
    def __init__(self):
        Thread.__init__(self)
        self.count_downloaded_bytes = 0

    def run(self):
        sniff(filter="ip", prn=self.get_packet)

    def get_packet(self, packet):
        self.count_downloaded_bytes += len(packet) # calculate size of packets

    def get_count_downloaded_bytes(self):
        count_d_bytes = self.count_downloaded_bytes
        self.count_downloaded_bytes = 0
        return count_d_bytes # returns size of downloaded data in bytes

Этот код вычисляет пропускную способность в Мбит / с каждые 10 секунд

class NetworkSpeed(Thread):
    def  __init__(self):
        Thread.__init__(self)
        self.sniffer = Sniffer() # create seconds thread, that sniffs traffic
        self.start()

    def calculate_bandwidth(self, count_downloaded_bytes, duration):
        download_speed = (count_downloaded_bytes / 1000000 * 8) / duration
        print('download_speed = ', download_speed)

    def run(self):
        counter = 0
        self.sniffer.start()
        while True:
            if counter == 10:
            self.calculate_bandwidth(self.sniffer.get_count_downloaded_bytes(), 10)
            counter = 0

        counter += 1
        sleep(1)

network_speed = NetworkSpeed()

Я знаю, что код не очень хорош, это всего лишь прототип. Но у меня есть следующая проблема: я запустил этот скрипт с правами суперпользователя и через 5 минут мой компьютер завис, он начал работать очень-очень медленно. Похоже, этот скрипт забрал всю оперативную память. Как я могу это исправить ? потому что скрипт должен работать не менее 1 дня.

1 Ответ

0 голосов
/ 07 января 2019

Я думаю, что проблема может заключаться в функции sniff, попробуйте вызвать с

def run(self):
    sniff(filter="ip", prn=self.get_packet,store=False)

чтобы не сохранять пакеты и не заполнять оперативную память.

...