在使用Redis pub/sub的Python服务中调试内存泄漏

2024-04-20 01:17:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用Redis发布/订阅功能构建python2.7服务。我在Ubuntu12.04上使用Redis2.8.17,RedisPy2.10.3作为客户端。不幸的是,我的服务似乎正在泄露内存。处理/处理服务消耗的内存量似乎增加了。在

我试图使用工具memory_profiler对主订阅循环进行调试。为了让它连续打印输出,我将它更改为每收到百条消息就退出一次。输出如下:

Line #    Mem usage    Increment   Line Contents
================================================
    62     39.3 MiB      0.0 MiB       @memory_profiler.profile
    63                                 def _listen(self, callback):
    64     40.1 MiB      0.7 MiB           for _ in self.redis_pubsub.listen():
    65     40.1 MiB      0.0 MiB               self.count += 1
    66     40.1 MiB      0.0 MiB               self._consume(callback)
    67     40.1 MiB      0.0 MiB               if self.count == 100:
    68     40.1 MiB      0.0 MiB                   self.count = 0
    69     40.1 MiB      0.0 MiB                   break
    70     40.1 MiB      0.0 MiB           gc.collect()

它报告说,每推送到该服务的每100条消息都会有类似的增长。回调是一个实际执行应用程序操作的函数,所以第65行是如果我的应用程序代码中有错误的话,我实际上会期望内存增加的地方。。在

这个输出使我怀疑redis客户端,所以我还检查了self.redis_200b订阅以及redis.StrictRedis公司对象使用皮普勒·阿西泽夫. 这些对象从一开始就很小,并且在服务接收消息时根本不会增加。在

此外,当试图使用皮普勒·穆比以及pympler.总结,它不报告任何增长的对象计数或积累的内存。此外,内存消耗和增长的总数量与top在Linux中提供的数字不同。在

我被卡住了,有人知道可能会发生什么吗?或者对我如何进一步调试这个有什么想法吗?在


Tags: 对象内存selfredis消息客户端报告count
1条回答
网友
1楼 · 发布于 2024-04-20 01:17:49

我花了几个小时调试pub/sub设置中的相同问题。确实存在内存泄漏,我无法在发布消息时找到避免它的方法。我的转变是使用multiprocessing在单独的进程上运行发布部分。这对我很有用,因为我每隔几秒钟就发布一次消息,所以这是一个合理的折衷方案。在

另一个没有泄漏的替代方案是tornadis

相关问题 更多 >