В настоящее время интенсивно используется память scapy 2.4.0 на python 2.7, работающем на centos 7.4
, первоначально я думал, что это из-за https://bitbucket.org/secdev/scapy/issues/5149/rdpcap-and-wrpcap-file-descriptor-leak, но это было исправлено некоторое время назад.
import scapy
from guppy import hpy
import psutil
hp = hpy()
class SessionBuilder(object):
def __init__(self):
pass
def get_sessions(pcap):
# this heap always reports 50mb usage
hp.heap()
process = psutil.Process(os.getpid())
# I expect this memory to be around 50mb... but that's not always true
print process.memory_info()
opened_pcap = rdpcap("pcap_location")
sessions = opened_pcap.session()
# this heap always reports 50mb usage
hp.heap()
# I expect this memory to be larger which is it
print process.memory_info()
return sessions
внутри другого файла python
import SessionBuilder
class session_worker
def __init__(self):
self.sb = SessionBuilder()
def work(self):
for pcap in pcaps:
sessions = self.sb.get_sessions(pcap)
# I then go about doing some things with these sessions
извиняюсь за некоторые ошибки в коде, но он работает в автономной системе, поэтому просто добавил грубую часть того, что я делаю.
каждый раз, когда я обхожу цикл, существует вероятность того, что память из предыдущего цикла останется, и это просто увеличивается до тех пор, пока у меня не останется памяти (не показано в приведенном выше коде, но есть некоторая логика, которая будет игнорировать любой pcapэто больше чем 1/4 доступной памяти на коробке, чтобы scapy мог открыть ее для извлечения сессий)
согласно Использование heapy для отслеживания утечек памяти в приложении Django количество кучи, представляющее память, которую использует python, а не какой-либо основной код cЯ предполагаю, что Scapy использует C внизу?