芹菜+兔菜++"A socket error ocurred"



我在Django中使用Celery,在Heroku上使用RabbitMQ作为代理。我的RabbitMQ服务是Heroku上的CloudAMQP Tough。如果相关的话,我们一直有一些频繁的内存泄漏,我一直在尝试填补,但通常情况下,当这种情况发生时,服务不会降级。

当网站流量很大时(比如今天),我开始偶尔出现以下错误:

Couldn't log in: a socket error occurred

该任务已完全抛出,并且未在任何位置注册。这显然是一个关键业务问题。我的芹菜设置如下:

BROKER_URL = os.getenv('CLOUDAMQP_URL', DEFAULT_AMQP)
CELERY_TASK_SERIALIZER = 'pickle'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_ACCEPT_CONTENT = ['pickle', 'json']
CELERY_ENABLE_UTC = True
# CELERY_RESULT_BACKEND = 'djcelery.backends.database:DatabaseBackend']
CELERY_STORE_ERRORS_EVEN_IF_IGNORED = True
CELERY_SEND_TASK_ERROR_EMAILS = True
CELERY_RESULT_BACKEND = False
CELERY_IMPORTS = ('business.admin', 'mainsite.views', 'utils.crons', 'mainsite.forms', )
BROKER_POOL_LIMIT = 5
# trying to clean up this memory leak
CELERYD_MAX_TASKS_PER_CHILD = 5
CELERYD_TASK_TIME_LIMIT = 60*60

我对芹菜有点陌生,所以我很乐意提供任何有帮助的日志等作为后续信息,但我甚至不确定现在该提供什么。在我的环境或环境中,有没有什么明显的东西可能会在交通繁忙时造成这个问题?

Socket错误可能是由于RabbitMQ或Heroku被Linux内存不足杀手杀死。当服务器由于某些进程的内存分配不足而耗尽内存时,Linux内核会试图找到原因并杀死相关的进程。RabbitMQ使用过多内存可能会导致死亡。您可以使用grep -i kill /var/log/messages* 了解Linux OOM是否杀死了特定的进程

使用以下链接了解更多详细信息&学习Linux OOM配置:

如何配置Linux内存不足杀手

你使用supervisord吗?

Supervisord是一个用于运行和监视进程的漂亮守护程序。使用这个,您可以确保所有长时间运行的进程(如RabbitMQ)始终处于运行状态;运行,即使进程被终止。

内存泄漏有两个可能的原因:

  1. 如果设置。DEBUG为True,这可能导致内存泄漏。请确保设置。DEBUG if在辅助配置中设置为False。

  2. 如果计划保留任务结果,则应该使用这些结果。如果您不使用它们,您将面临内存泄漏问题。为了解决这个问题,您可以使用以下行更改您的设置:

    # Just ignore the results, in case you're not consuming results.
    CELERY_IGNORE_RESULT = True
    CELERY_STORE_ERRORS_EVEN_IF_IGNORED = False
    

最新更新