RocketMQ 的 Python 版的 SDK 内存泄漏的问题?

2023-08-24 09:56:30 +08:00
 chaizz

各位大佬有用过 RocketMQ 的 Python 版的 SDK 吗? 我在使用生产者循环发消息的的时候,内存一直在缓慢上升,不知道是不是使用不当造成的。

Python 版本:3.8.17
rocketmq-client-python 版本:2.0.1rc1 (自己下载的master分支下手动安装的)

代码:

def send_message(producer, body):
    try:
        message = Message("test")
        message.set_body(json.dumps(body))
        result = producer.send_sync(message)
        print(f"生产者发送消息状态: {str(result.status)} 消息 ID: {result.msg_id}, offset: {result.offset}")
        del result
    except Exception as e:
        print(f"生产者发送消息失败:{repr(e)}")

    finally:
        del message
        gc.collect()

def producer():
    ROCKETMQ_HOST = os.getenv("ROCKETMQ_HOST")
    ROCKETMQ_PORT = os.getenv("ROCKETMQ_PORT")
    ROCKETMQ_ACCESS_KEY = os.getenv("ROCKETMQ_ACCESS_KEY")
    ROCKETMQ_ACCESS_SECRET = os.getenv("ROCKETMQ_ACCESS_SECRET")

    producer = Producer('algo-producer')
    producer.set_name_server_address(f"{ROCKETMQ_HOST}:{ROCKETMQ_PORT}")
    producer.set_session_credentials(ROCKETMQ_ACCESS_KEY, ROCKETMQ_ACCESS_SECRET, "")
    producer.start()

    try:
        while True:
            body = {"a":'x'}
            send_message(producer,json.dumps(body))
            time.sleep(0.2)
    except KeyboardInterrupt:
        print("退出")
    finally:
        producer.shutdown()



if __name__ == '__main__':
    producer()

1543 次点击
所在节点    Python
10 条回复
julyclyde
2023-08-24 12:54:17 +08:00
1 不过为啥你要 json.dumps 两遍呢?
2 gc.collect()似乎不是什么必须写的句子啊,send_message 函数完成的时候,message 变量自然会消失的
3 能不能试试销毁重建 producer 变量?
chaizz
2023-08-24 17:25:00 +08:00
@julyclyde
1 、这是我复制代码的时候复制错了。实际代码没有 dumps 两遍。
2 、gc.collect() 确实不是必须写语句, 我是确认在手动 gc 之后,仍然会有内存攀升的问题。
3 、这种做法我之前也试过,我在重新测试测试。
感谢回答~
julyclyde
2023-08-25 14:54:05 +08:00
@chaizz 我之前遇到类似的内存泄漏,调了 numpy ,但是无法证明因果关系。gc 同样无效。我怀疑是漏在外面的库里,而不是 python 这边
chaizz
2023-08-25 17:46:33 +08:00
@julyclyde #3 经过我测试确实是这个 sdk 的问题,他是调用的 CPP 的接口。
julyclyde
2023-08-27 18:57:05 +08:00
@chaizz 找到证据了嘛?
chaizz
2023-08-28 09:38:38 +08:00
@julyclyde #5 我使用 memory_profiler 查看了一下,发现应该是生成 producer 时候和销毁 producer 时内存消耗不一致,估计是 producer 在销毁时还有其他的对象没有被销毁导致的。
NoAnyLove
2023-08-29 12:11:56 +08:00
先上 tracemalloc 判断是不是 Python 对象的泄露
Ranglage
2023-09-01 08:00:44 +08:00
问题解决了么?内存泄漏出在哪里? python 还是 rocketmq ?
chaizz
2023-09-01 09:22:00 +08:00
@NoAnyLove 测试了一下应该是 rocketmq 的问题,生产者在销毁的时候,没有清除对应的内存。
chaizz
2023-09-01 09:22:07 +08:00
@Ranglage 测试了一下应该是 rocketmq 的问题,生产者在销毁的时候,没有清除对应的内存。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/967845

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX