在Linux上使用外部进程管道时使用pika / rabbitmq时内存泄漏

时间:2015-05-19 22:46:15

标签: python linux memory-leaks rabbitmq pika

所以我一直在努力解决过去两天无法解释的问题。

我的目标是使用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”行,同样的问题就会消失!

我真的对这个问题感到困惑,特别是当内存泄漏来自第三方进程时,不应该以这种方式受到影响。

我真的希望有人能够为我解释这个问题,甚至指出我的方向。

谢谢, 戴夫。

0 个答案:

没有答案
相关问题