Redis作为Celery代理时因回复pidbox导致巨大的内存使用

7 投票
2 回答
3434 浏览
提问于 2025-04-18 17:48

我们正在使用celery 3.1.8,并且用Redis作为消息中介。我们的配置很简单,因为我们不关心结果,所以我们设置了:

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项,而这些项的内容非常庞大。

有人能告诉我为什么这些回复的pidbox会存在吗?虽然我们已经设置celery忽略结果。它们对于celery来说是必要的吗?如果我们对任务的结果不感兴趣的话?

我们希望能去掉这些,因为它们让原本只需要大约10MB内存的实例变成了需要大约3GB内存。

如果需要更多关于配置的信息,请告诉我,任何帮助都非常感谢。

2 个回答

0

如果你想完全关闭工作进程中对pidbox的使用逻辑,可以把CELERY_ENABLE_REMOTE_CONTROL这个选项去掉。

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

不过要注意,这样做会让你失去一些运行时修改的能力。比如,你将无法查看工作进程正在处理哪些队列、它的活跃任务、添加队列等信息。

因此,flower这个工具的一些功能也会受到限制。

可能早期版本的这个库在其他情况下会通过pidbox发送这些统计信息或数据。

0

我觉得你想要找到的设置是 CELERY_SEND_EVENTS,这个设置默认是开启的,主要是为了像 celerymon 这样的工具使用。不过对我来说,把 CELERY_SEND_EVENTS = False 设置成假并没有什么变化。不过你可以试试看,也许对你有用。

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

CELERY_SEND_EVENTS

这个设置会发送事件,这样工具像 celerymon 就可以监控工作进程。

撰写回答