我正在尝试找出芹菜,我登陆的大多数配置都来自猜测和更新设置后监控作业/性能。
几个有趣的观察结果——
我继续看到一个 redis 错误ConnectionError('max number of clients reached',)
.当我添加更多定期任务时,就会发生这种情况。令人困惑的是,我的 redis 计划最多有 40 个连接。在我的 django 应用程序中,我将芹菜配置为允许 20 作为最大 redis 连接量。一些配置可以在下面找到。
CELERY_REDIS_MAX_CONNECTIONS = 20
CELERY_RESULT_EXTENDED = True
CELERY_BROKER_TRANSPORT_OPTIONS = {
"fanout_prefix": True,
"fanout_patterns": True,
"max_connections": 10,
"socket_keepalive": True,
}
我最终升级了 Celery、Redis 和 Celery Beat,并删除了上述配置。从那以后,我再也没有看到同样的问题。
celery-redbeat==0.13.0 --> celery-redbeat==1.0.0
celery==4.3.0 --> celery==4.4.4
redis==3.3.11 --> redis==3.5.3
因此,在此升级之后,我的连接错误暂时消失了。我注意到在我的 redis 实例中,连接数几乎从每天平均 39 个减少到 24 个。
我解决的下一个错误是 r14 错误,我超过了我的内存限制。我通过将它默认设置为 8 来解决此问题--concurency=4
。截至目前,不再有 r14。让我感到困惑的是 - 我认为芹菜的默认设置阻止了这些问题,就像它根据处理任务的机器上的内核数选择并发一样。
所以 TLDR -
我有 1 个芹菜工人,2 个队列,我知道我正在运行的定期任务数量以及总体作业的数量。
有了上述信息,我是否可以使用公式来确定诸如concurrency
,redis_max_connections
,broker_pool_limit
和其他优化之类的东西,这些优化将消除对我当前正在做的事情的大量猜测。
答案很简单——不。没有公式可用于 Celery 配置选项的所有组合。
此外,示例的并发设置在很大程度上取决于任务的类型。如果任务是计算密集型的,那么将并发性设置为高于 CPU 内核数的任何值是没有意义的。如果没有,那么您甚至可以乘以 10,具体取决于您的任务使用了多少 CPU。
与 Redis 最大连接数和代理池限制相同 - 除了默认值之外,您几乎不需要任何其他内容,但是,如果您有数百个工作线程(不是工作进程(,那么您可能会遇到连接问题,因此您可能实际上需要调整这些数字。