Celery + RabbitMQ +“发生套接字错误”

问题描述:

我在Django中使用Celery和RabbitMQ作为Heroku的代理。我的RabbitMQ服务是在Heroku上的CloudAMQP Tough。如果相关,我们一直在尝试插入一些频繁的内存泄漏,但通常情况下服务不会降级。Celery + RabbitMQ +“发生套接字错误”

当该网站是繁忙的(像今天),我开始变得偶然的错误如下所示:

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 

我有点新的芹菜,所以我很高兴能提供作为后续任何日志/等会有所帮助,但我甚至不能确定提供什么在此刻。在我的设置或环境中是否有任何明显的迹象表明,在大量贩卖时可能导致此问题?

+0

也许你跑了文件描述符? – 2014-10-28 22:46:20

套接字错误可能是由于RabbitMQ或Heroku被Linux Out-of-Memory Killer杀死。由于某些进程没有使用内存分配而导致服务器内存不足时,Linux内核会尝试查找原因并杀死相关进程。 RabbitMQ使用太多内存可能会导致死亡。 你可以看看Linux的OOM杀死使用grep -i kill /var/log/messages*

使用下面的更多细节&学习Linux的OOM配置链接特定进程:

How to Configure the Linux Out-of-Memory Killer

你使用supervisord?

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

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

  1. 如果settings.DEBUG是真,这可能会导致内存泄漏。确保您的工作系统配置中的settings.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