【问题标题】:Launching celery worker creates too many connexions to redis启动 celery worker 会创建太多与 redis 的连接
【发布时间】:2021-10-03 07:44:15
【问题描述】:

我在 django 项目中使用 celeryredis 作为代理。

我遇到的问题是,即使没有运行任何任务,只要启动 worker 就会产生多达 10 个与 redis 服务器的新连接。

celery -A proj worker -l INFO

如果我在 redis-cli 中检查 CLIENT LIST,我会看到:

127.0.0.1:6379> CLIENT LIST

id=272 addr=127.0.0.1:48846 fd=16 name= age=63 idle=63 flags=N db=2 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 argv-mem=0 obl=0 oll=0 omem=0 tot-mem=20520 events=r cmd=sadd user=default
id=270 addr=127.0.0.1:48842 fd=14 name= age=64 idle=64 flags=N db=2 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 argv-mem=0 obl=0 oll=0 omem=0 tot-mem=20520 events=r cmd=publish user=default
id=4 addr=127.0.0.1:46946 fd=8 name= age=14901 idle=0 flags=N db=0 sub=0 psub=0 multi=-1 qbuf=26 qbuf-free=32742 argv-mem=10 obl=0 oll=0 omem=0 tot-mem=61466 events=r cmd=client user=default
id=265 addr=127.0.0.1:48832 fd=9 name= age=64 idle=0 flags=b db=2 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 argv-mem=0 obl=0 oll=0 omem=0 tot-mem=20536 events=r cmd=brpop user=default
id=266 addr=127.0.0.1:48834 fd=10 name= age=64 idle=63 flags=N db=2 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 argv-mem=0 obl=0 oll=0 omem=0 tot-mem=20520 events=r cmd=sadd user=default
id=273 addr=127.0.0.1:48848 fd=17 name= age=63 idle=2 flags=P db=2 sub=0 psub=1 multi=-1 qbuf=0 qbuf-free=0 argv-mem=0 obl=0 oll=0 omem=0 tot-mem=20504 events=r cmd=psubscribe user=default
id=274 addr=127.0.0.1:48850 fd=18 name= age=63 idle=63 flags=N db=2 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 argv-mem=0 obl=0 oll=0 omem=0 tot-mem=20520 events=r cmd=sadd user=default
id=267 addr=127.0.0.1:48836 fd=11 name= age=64 idle=64 flags=N db=2 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 argv-mem=0 obl=0 oll=0 omem=0 tot-mem=20496 events=r cmd=ping user=default
id=268 addr=127.0.0.1:48838 fd=12 name= age=64 idle=2 flags=N db=2 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 argv-mem=0 obl=0 oll=0 omem=0 tot-mem=20520 events=r cmd=publish user=default
id=269 addr=127.0.0.1:48840 fd=13 name= age=64 idle=64 flags=N db=2 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=0 argv-mem=0 obl=0 oll=0 omem=0 tot-mem=20496 events=r cmd=ping user=default
id=271 addr=127.0.0.1:48844 fd=15 name= age=63 idle=14 flags=P db=2 sub=0 psub=1 multi=-1 qbuf=0 qbuf-free=0 argv-mem=0 obl=0 oll=0 omem=0 tot-mem=20504 events=r cmd=ping user=default

我尝试过更改--concurrency=1,以及CELERY_BROKER_POOL_LIMIT=NoneBROKER_TRANSPORT_OPTIONS = {'max_connections': 1},但似乎都没有改变与redis 的连接数。

我的问题是,是什么造成了所有这些联系,究竟是为了什么?

【问题讨论】:

    标签: django redis celery


    【解决方案1】:

    我的问题是,是什么造成了所有这些联系,究竟是为了什么?

    所有连接都是一次性创建的,并在您创建的所有任务中汇集和持久化。因此,所有连接立即开始是正常的。使用连接池效率更高,因为连接可以重复使用——创建新连接会产生大量开销,因此提前创建连接并保留它们是有益的。

    因为连接是pooled,所以更改--concurrency 没有效果;如果您添加更多并发,它们仍然使用具有相同连接数的相同连接池。

    单个任务(greenlets)必须使用 redis 连接来确认任务,例如,作为正常代理工作流的一部分。

    您需要少于 10 个连接(默认)是否有原因?

    如果您尝试限制连接数,则不应设置CELERY_BROKER_POOL_LIMIT=None。这可能会导致在任务实际运行时创建更多连接,因为将其设置为None 将导致每次在需要与 redis 的连接时建立一个新连接,然后立即关闭。这会增加很多开销,并且在大多数情况下不是一个好主意。

    此外,在 django 设置中设置时,所有 celery 设置都必须以 CELERY_ 为前缀。所以你应该使用CELERY_BROKER_TRANSPORT_OPTIONS 而不是BROKER_TRANSPORT_OPTIONS

    【讨论】:

    • 感谢您的回答,我需要减少连接数,因为我已经在 heroku 上使用了 12 个连接,而 redis 免费计划提供了 20 个最大连接。我知道我可能需要升级,但我应该考虑多少个连接我还想使用 beat worker(用于计划任务)和花进行监控。
    猜你喜欢
    • 2020-12-23
    • 2014-12-24
    • 2015-06-13
    • 1970-01-01
    • 1970-01-01
    • 2018-11-03
    • 2019-11-07
    • 2019-11-20
    • 2020-04-15
    相关资源
    最近更新 更多