我在试着找出celery ,我登陆的大多数配置都来自猜测和更新设置后监视作业/性能。
一些有趣的观察结果-
我一直看到redis的错误 ConnectionError('max number of clients reached',)
. 当我添加了更多的周期性任务时,情况就发生了。令人困惑的是,我的redis计划最多有40个连接。在我的django应用程序中,我将celery 配置为最多允许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错误,我的内存超过了限制。我通过设置 --concurency=4
默认为8。现在没有更多的R14了。让我困惑的是——我认为celery 的默认设置阻止了这些问题,比如它根据处理任务的机器上的内核数选择并发。
所以tldr-
我有1个celery 工人,2个队列,我知道我正在运行的定期任务的数量和总的工作数量。
有了以上信息,有没有公式可以用来判断 concurrency
, redis_max_connections
, broker_pool_limit
以及其他优化,这将需要我目前正在做的很多猜测。
1条答案
按热度按时间dw1jzc5e1#
答案很简单-不。没有一个公式可以用于所有celery 配置选项的组合。
此外,示例的并发设置在很大程度上取决于任务的类型。如果任务是计算密集型的,那么将并发性设置为高于cpu核心数的任何值都是没有意义的。如果不是,那么您甚至可以乘以10,这取决于您的任务使用了多少cpu。
关于redis max connections和broker pool limit也是一样的-除了默认值之外,您很少需要其他任何东西,但是,如果您有数百个工作进程(不是工作进程),那么您可能会遇到连接问题,因此您实际上可能需要调整这些数字。