所以我一直在努力解决过去两天无法解释的问题。
我的目标是使用tshark(命令行Wireshark)来监听流量并将数据包转换为XML格式,并通过rabbitmq将这些XML数据包转发给另一个工作者。
这是我的代码:
#!/usr/bin/env python
from subprocess import Popen, PIPE
import pika
def main():
tshark_process = Popen(['/usr/bin/tshark', '-i', 'eth0', '-T', 'pdml'],
stdout=PIPE ,
shell=False)
message= []
connection = pika.BlockingConnection(pika.ConnectionParameters("localhost"))
channel = connection.channel()
channel.queue_declare(queue="packets", durable=True)
for line in tshark_process.stdout:
if "<packet>" in line:
message = []
if "</packet>" in line:
message.append(line)
full_message = "".join(message)
channel.basic_publish(exchange='',
routing_key="packets",
body=full_message,
properties=pika.BasicProperties(
delivery_mode = 2, # make message persistent
))
message = []
else:
message.append(line)
if __name__ == '__main__':
main()
工作人员实际上可以看到数据包,看起来很棒。但是当我运行命令“top”时,我可以看到tshark进程的内存使用量一直在增加(大约每秒200k)。一段时间后,由于内存已满,python程序因MemoryError崩溃。
所以这听起来像是一个tshark问题,对吧?
好吧,当单独运行tshark时 - 内存使用量仅在1-2秒之后就会以非常低的数量稳定,并且在此之后永远不会上升。
如果我评论“channel.basic_publish”行,同样的问题就会消失!
我真的对这个问题感到困惑,特别是当内存泄漏来自第三方进程时,不应该以这种方式受到影响。
我真的希望有人能够为我解释这个问题,甚至指出我的方向。
谢谢, 戴夫。