2015-06-29 7 views
4

Я написал сценарии, которые регистрируют MAC-адреса из pcapy в mysql через SQLAlchemy, изначально я использовал прямой sqlite3, но вскоре понял, что требуется что-то лучшее, поэтому в эти выходные, когда я переписал всю базу данных, выполнить SQLAlchemy. Все работает нормально, данные поступают и снова появляются. Я, хотя sessionmaker() был бы очень полезен для управления всеми сеансами в БД для меня.Использование памяти Strange Python с помощью Scapy

Я вижу странное явление в отношении потребления памяти. Я запускаю скрипт ... он собирает и записывает все в DB ... но на каждые 2-4 секунды у меня есть мегабайт в размере увеличения потребления памяти. На данный момент я говорю о очень немногих рекордах, под-100 рядах.

Последовательность сценария:

  1. сценария Запуск
  2. SQLAlchemy читает mac_addr колонку в maclist [].
  3. scapy получает пакет> если new_mac находится в maclist []?

если true? только пишите метку времени в столбец времени, где mac = newmac. вернуться к этапу 2.

если false?, тогда напишите новый mac на DB. очистить maclist [] и снова вызвать шаг 2.

После 1h30m у меня есть память размером 1027MB (RES) и 1198MB (VIRT) с 124 строками в базе данных 1 таблицы (MySQL).

В: Может ли это быть внесено в список maclist [], очищаемый и повторно заполненный из БД каждый раз?

В: Что произойдет, когда оно достигнет максимальной памяти системы?

Любые идеи или советы были бы очень благодарны.

вывод memory_profiler для рассматриваемого сегмента, где список [] заполняется из столбца базы данных mac_addr.

Line # Mem usage Increment Line Contents 
================================================ 
    123 1025.434 MiB 0.000 MiB @profile 
    124        def sniffmgmt(p): 
    125        global __mac_reel 
    126        global _blacklist 
    127 1025.434 MiB 0.000 MiB stamgmtstypes = (0, 2, 4) 
    128 1025.434 MiB 0.000 MiB tmplist = [] 
    129 1025.434 MiB 0.000 MiB matching = [] 
    130 1025.434 MiB 0.000 MiB observedclients = [] 
    131 1025.434 MiB 0.000 MiB tmplist = populate_observed_list() 
    132 1025.477 MiB 0.043 MiB for i in tmplist: 
    133 1025.477 MiB 0.000 MiB   observedclients.append(i[0]) 
    134 1025.477 MiB 0.000 MiB _mac_address = str(p.addr2) 
    135 1025.477 MiB 0.000 MiB if p.haslayer(Dot11): 
    136 1025.477 MiB 0.000 MiB  if p.type == 0 and p.subtype in stamgmtstypes: 
    137 1024.309 MiB -1.168 MiB   _timestamp = atimer() 
    138 1024.309 MiB 0.000 MiB   if p.info == "": 
    139 1021.520 MiB -2.789 MiB      _SSID = "hidden" 
    140           else: 
    141 1024.309 MiB 2.789 MiB      _SSID = p.info 
    142          
    143 1024.309 MiB 0.000 MiB   if p.addr2 not in observedclients: 
    144 1018.184 MiB -6.125 MiB     db_add(_mac_address, _timestamp, _SSID) 
    145 1018.184 MiB 0.000 MiB     greetings() 
    146          else: 
    147 1024.309 MiB 6.125 MiB    add_time(_mac_address, _timestamp) 
    148 1024.309 MiB 0.000 MiB    observedclients = [] #clear the list 
    149 1024.309 MiB 0.000 MiB    observedclients = populate_observed_list() #repopulate the list 
    150 1024.309 MiB 0.000 MiB    greetings() 

Вы увидите, что наблюдаемые клиенты - это список.

+0

Очень трудно сказать что-либо без кода, если предположить, что это не утечка в SQLAlchemy или scapy а не в вашем коде (кажется маловероятным). Кажется, у вас есть представление о том, где может произойти утечка, выполните некоторые [профилирование памяти] (http://stackoverflow.com/questions/110259/which-python-memory-profiler-is-recommended), чтобы убедиться, что вы были правы , Как только ваш процесс python будет потреблять достаточное количество памяти, вы, вероятно, получите исключение «MemoryError». –

ответ

4

Мне удалось найти фактическую причину потребления памяти. Это было самонадеянно. По умолчанию Scapy установлен для хранения всех захваченных пакетов. Но вы можете отключить его.

Disable:

sniff(iface=interface, prn=sniffmgmt, store=0) 

Enable:

sniff(iface=interface, prn=sniffmgmt, store=1) 

Благодаря BitBucket Ticket

0

Очень сложно сказать что-либо без кода, предполагая, что это не утечка в SQLAlchemy или scapy, а не в вашем коде (кажется маловероятным).

У вас, кажется, есть идея, где может произойти утечка, сделайте memory profiling, чтобы узнать, были ли вы права.

Как только ваш процесс python будет потреблять достаточное количество памяти, вы, вероятно, получите исключение MemoryError.

+0

Позвольте мне запустить профилировщик в разделе кода и посмотреть, с чем он возвращается. Я использовал параметр memory_profiler -m в python, чтобы понять, что может быть причиной, но то, что я вижу, не имеет смысла, поэтому позвольте мне запустить его и опубликовать результаты. –

+0

Я загрузил вывод профилировщика, в котором используется список. –

1

Как вы видите, выход профилировщика предполагает, что вы используете меньше памяти к концу, поэтому это не отражает вашу ситуацию.

Некоторые направления рыть глубже: 1) add_time (почему это возрастающее использование памяти) 2) db_add (почему она убывающее использование памяти кэширования закрытия/открытие соединения с базой данных, что происходит в случае неудачи????) 3) populate_observed_list (есть ли допустимое значение для сбора мусора? Могут быть какие-то пакеты, для которых возникает определенное исключение?)

Кроме того, что происходит, если вы обнюхиваете больше пакетов, чем ваш код может обрабатывать, ?

Я бы рассмотрел эти 3 функции и проанализировал возможные исключения/сбои.

0

Спасибо за руководство всем. Я думаю, мне удалось решить растущее потребление памяти.

A: Логика кода играет очень важную роль в потреблении памяти, как я узнал. Если вы посмотрите на вывод memory_profiler в моем первоначальном вопросе, я переместил строки 131-133 в оператор IF на строке 136. Это, по-видимому, не так часто увеличивает память. Теперь мне нужно уточнить, что populate_observedlist() немного больше, чтобы не тратить столько памяти.

Смежные вопросы