jdo*_*dot 6 python django heroku rabbitmq celery
我正在使用Django中的Celery和RabbitMQ作为Heroku的经纪人.我的RabbitMQ服务是Heroku上的CloudAMQP Tough.如果相关,我们一直在尝试插入一些频繁的内存泄漏,但一般情况下服务不会降级.
当网站被大量贩运时(如今),我开始偶尔出现如下错误:
Couldn't log in: a socket error occurred
Run Code Online (Sandbox Code Playgroud)
任务完全抛弃,未在任何地方注册.这显然是一个关键业务问题.我的芹菜设置如下:
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
Run Code Online (Sandbox Code Playgroud)
我对芹菜有点新意,所以我很乐意提供后续任何日志/等等都会有所帮助,但我甚至不确定在这一点上提供什么.在我的设置或环境中是否有任何明显的东西,似乎在大量贩运时可能导致此问题?
套接字错误可能是由于 RabbitMQ 或 Heroku 被 Linux Out-of-Memory Killer 杀死所致。当服务器由于某些进程未使用内存分配而耗尽内存时,Linux 内核会尝试查找原因并杀死相关进程。RabbitMQ 使用过多内存可能会导致被杀死。您可以使用以下命令了解 Linux OOM 是否杀死了特定进程grep -i kill /var/log/messages*
使用以下链接了解更多详细信息并了解 Linux OOM 配置:
你使用supervisord吗?
Supervisord是一个用于运行和监视进程的漂亮守护进程。使用这个,您可以确保所有长时间运行的进程(例如 RabbitMQ)始终启动并运行,即使该进程被终止。
内存泄漏的可能原因有两种:
如果 settings.DEBUG 为 True,则可能会导致内存泄漏。确保在工作配置中将 settings.DEBUG 设置为 False。
如果您打算保留任务结果,则应该使用它们。如果您不使用它们,您将面临内存泄漏问题。要解决该问题,您可以使用以下行更改设置:
# Just ignore the results, in case you're not consuming results.
CELERY_IGNORE_RESULT = True
CELERY_STORE_ERRORS_EVEN_IF_IGNORED = False
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
2610 次 |
| 最近记录: |