- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在 Django 中使用 Celery,在 Heroku 上使用 RabbitMQ 作为代理。我的 RabbitMQ 服务是 CloudAMQP Tough在 Heroku 上。如果相关的话,我们一直有一些频繁的内存泄漏问题,我一直在尝试解决这些问题,但通常情况下服务不会在发生时降级。
当网站流量很大时(比如今天),我开始偶尔遇到如下错误:
Couldn't log in: a socket error occurred
任务被完全抛出,没有在任何地方注册。这显然是一个业务关键问题。我的 celery 设置如下:
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
我对 celery 有点陌生,所以我很乐意提供后续日志/等任何有用的东西,但我什至不确定此时要提供什么。在我的设置或环境中是否有任何明显的东西看起来可能在流量很大时导致此问题?
最佳答案
套接字错误可能是由于 RabbitMQ 或 Heroku 被 Linux Out-of-Memory Killer 杀死。当服务器由于某些进程未使用内存分配而耗尽内存时,Linux 内核会尝试查找原因并杀死相关进程。 RabbitMQ 使用过多的内存可能会导致被杀死。您可以使用 grep -i kill/var/log/messages*
使用以下链接了解更多详细信息并了解 Linux OOM 配置:
How to Configure the Linux Out-of-Memory Killer
你用supervisord吗?
Supervisord是一个漂亮的守护进程,用于运行和监控进程。使用这个,您可以确保所有长时间运行的进程(例如 RabbitMQ)始终启动并运行,即使进程被终止也是如此。
内存泄漏有两种可能的原因:
如果 settings.DEBUG 为 True,这可能会导致内存泄漏。确保 settings.DEBUG if 在您的工作器配置中设置为 False。
如果您打算保留任务结果,则应该使用它们。如果您不使用它们,您将面临内存泄漏问题。要解决此问题,您可以使用以下行更改设置:
# Just ignore the results, in case you're not consuming results.
CELERY_IGNORE_RESULT = True
CELERY_STORE_ERRORS_EVEN_IF_IGNORED = False
关于python - celery + RabbitMQ + "A socket error ocurred",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26599440/
我是一名优秀的程序员,十分优秀!