由于回复 pidboxes,Redis 在用作 Celery 代理时占用了大量内存

Posted

技术标签:

【中文标题】由于回复 pidboxes,Redis 在用作 Celery 代理时占用了大量内存【英文标题】:Huge memory usage by Redis when used as a Celery broker because of reply pidboxes 【发布时间】:2014-10-12 18:02:05 【问题描述】:

我们正在使用 Redis 作为代理后端运行 celery 3.1.8。 我们的配置非常简单,我们不关心结果,为此我们设置了

CELERY_IGNORE_RESULT = True

但是我们注意到,我们的 redis 代理实例占用了大量内存 (~3GB),而其中的队列和消息的实际数量在任何给定时刻都非常少。 在检查 RDB 文件后,我们注意到有几个巨大的列表:

database,type,key,size_in_bytes,encoding,num_elements,len_largest_element
0,list,"ed2d26b5-b8fb-3478-ace7-6714e8a7b4ed.reply.celery.pidbox",70733024,linkedlist,4,17696745
0,list,"e3eda502-27eb-348d-a86e-1d78fc31b165.reply.celery.pidbox",35350876,linkedlist,2,17686857
0,list,"6421b8c1-bbc0-3a59-a7ee-f26450552a60.reply.celery.pidbox",35443327,linkedlist,2,17762611
0,list,"8439dcd0-921e-3922-8504-9057b6c9834a.reply.celery.pidbox",106088780,linkedlist,6,17696745
0,list,"85c667c8-63b6-338f-b00a-e1f2cd4da143.reply.celery.pidbox",17762845,linkedlist,1,17762611
0,list,"05d0c0f2-9530-37f3-a9cb-189fc237303c.reply.celery.pidbox",106088769,linkedlist,6,17696743
0,list,"d3f200fd-c81e-3d6d-acf3-d0e9021e7e5c.reply.celery.pidbox",35431615,linkedlist,2,17762611
0,list,"7b4291c7-b916-3806-910b-c250c9a7fece.reply.celery.pidbox",88401866,linkedlist,5,17696745
0,list,"0c8b64c1-7efe-3070-b2e3-980f395b84e8.reply.celery.pidbox",123752294,linkedlist,7,17696743
0,list,"e5cf288b-8ced-3f6c-891e-34e2d302c89c.reply.celery.pidbox",70711492,linkedlist,4,17691717
0,list,"a9cafe29-204d-3d97-9b7b-322a847d0789.reply.celery.pidbox",53121613,linkedlist,3,17762611
0,list,"1c1f90ca-1fe1-35e4-a144-3a97177a674b.reply.celery.pidbox",35431683,linkedlist,2,17762611

这些列表包含一些 json 项目,每个项目都包含一个巨大的 Body。

即使我们将 celery 设置为忽略结果,为什么仍然存在这些回复 pidbox 的任何指针? 如果我们对任务的结果不感兴趣,芹菜是否需要它们? 我们想摆脱这些,因为它们正在将一个需要约 10mb 内存的实例转换为约 3gb 内存。

任何帮助都会很棒,如果您需要有关配置的更多信息,请告诉我。

【问题讨论】:

【参考方案1】:

我认为您正在寻找的应该摆脱那些 pidbox 消息的设置是CELERY_SEND_EVENTS。对于像 celerymon 这样的工具,它默认启用。但是,对我来说,设置 CELERY_SEND_EVENTS = False 并没有改变任何东西。不过你可以试一试,也许它对你有用。

http://docs.celeryproject.org/en/3.1/configuration.html#celery-send-events

CELERY_SEND_EVENTS

发送事件,以便工作人员可以通过 celerymon 等工具进行监控。

【讨论】:

谢谢,试试这个看看能不能解决。现在我们注意到这些列表添加得很慢,所以我们有一个清理它们的任务。奇怪的是我们不使用 celerymon 或类似的东西,这些事件是由 celery 本身的东西添加的。 CELERY_SEND_EVENTS(现在?)默认关闭。顺便说一句,我遇到了与 OP 完全相同的问题【参考方案2】:

要完全禁用 worker 上的 pidbox 使用逻辑,您可以取消设置 CELERY_ENABLE_REMOTE_CONTROL

https://celery.readthedocs.io/en/latest/userguide/configuration.html#worker-enable-remote-control

请注意,这意味着您将失去某些运行时更改能力。您将无法询问工作人员从哪个队列消费、它是活动任务、添加队列等。

因此,花的特征集的这一部分同样会受到限制。

在其他情况下,早期版本的库可能会在 pidbox 上发送这些统计信息/信息。

【讨论】:

以上是关于由于回复 pidboxes,Redis 在用作 Celery 代理时占用了大量内存的主要内容,如果未能解决你的问题,请参考以下文章

redis实现分布式锁

Redis---String

redis 主从配置

redis哨兵部署

Redis中的简单动态字符串

Redis用作消息队列MQ