我正在尝试使用 Redis 发布/订阅功能构建 Python 2.7 服务。我在 Ubuntu 12.04 上使用 redis 2.8.17 和 redis-py 2.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()
它报告每推送到服务的一百条消息都有类似的增长。回调是实际执行应用程序的函数,所以如果我的应用程序代码有问题,我实际上希望在第 65 行增加内存。
输出让我怀疑是 redis 客户端,所以我还使用 pymler.asizeof 检查了 self.redis_pubsub 和 redis.StrictRedis 对象的大小。这些对象一开始很小,并且在服务接收消息时根本不会增加。
此外,当尝试使用 pympler.muppy 和 pympler.summarize 查找泄漏对象时,它不会报告任何增长的对象计数或累积的内存。此外,内存消耗和增长的总数与 Linux 中 top 提供的数字不同。
我被卡住了,有没有人知道可能发生了什么,或者对如何进一步调试有任何想法?