我有一个这样的班级:
class Detector:
...
def detect:
sniff(iface='eth6', filter='vlan or not vlan and udp port 53', prn=self.spawnThread, store=0)
def spawnThread(self, pkt):
t = threading.Thread(target=self.predict, args=(pkt,))
t.start()
def predict(self, pkt):
# do something
# write log file with logging module
其中sniff()
是scapy中的一种方法,对于捕获的每个数据包,它将数据包传递到spawnThread
,在spawnThread
中,我想创建不同的线程来运行predict
方法。
但是似乎有内存泄漏,我检查了Heapy并得到以下输出:
Partition of a set of 623561 objects. Total size = 87355208 bytes.
Index Count % Size % Cumulative % Kind (class / dict of class)
0 236145 38 26871176 31 26871176 31 str
1 139658 22 13805832 16 40677008 47 tuple
2 6565 1 7366648 8 48043656 55 dict (no owner)
3 1408 0 6592768 8 54636424 63 dict of module
4 25764 4 3297792 4 57934216 66 types.CodeType
5 17737 3 3223240 4 61157456 70 list
6 24878 4 2985360 3 64142816 73 function
7 14367 2 2577384 3 66720200 76 unicode
8 2445 0 2206320 3 68926520 79 type
9 2445 0 2173752 2 71100272 81 dict of type
元组对象的数量和大小一直在增长,我认为这是导致内存泄漏的原因,但我不知道在哪里以及为什么。感谢您的反馈!
更新:如果我不使用线程而直接从predict
调用sniff
,则不会发生内存泄漏。而且,该类中的其他任何地方都没有其他元组对象。在__init__
中,我刚刚启动了一些字符串,例如路径和名称。
class Detector:
...
def detect(self):
sniff(iface='eth6', filter='vlan or not vlan and udp port 53',
prn=self.predict, store=0)
def predict(self, pkt):
# do something with pkt
# write log file with loggin module