【问题标题】:Django 1.6 and Celery 3.0 memory leaksDjango 1.6 和 Celery 3.0 内存泄漏
【发布时间】:2013-11-24 08:54:14
【问题描述】:

将 Django 升级到 1.6 后,我的 celery worker 正在消耗 RAM。 似乎分配给工作人员的内存没有释放,并且在每次任务后都会增长。

相关设置:

# DB:
DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'somedb',
        'USER': '',
        'PASSWORD': '',
        'HOST': 'localhost',
        'PORT': '',
    }
}


# CELERY SETTINGS:
CELERY_RESULT_BACKEND = 'redis://'
BROKER_URL = 'redis://'

相关包版本:

Django==1.6
celery==3.0.24
django-celery==3.0.23
billiard==2.7.3.34
kombu==2.5.16
redis==2.7.6

在手动运行工作程序的本地环境(使用DEBUG=False)和使用 Upstart 运行 celery 的暂存环境中发生。


更新:

  1. 尝试设置autocommit=False,但没有成功。
  2. 可能与 Django 版本升级无关,而是与我必须升级以切换到 1.6 的某些设置或 3rd 方包有关。

【问题讨论】:

  • 您是否设置了时间限制? docs.celeryproject.org/en/latest/userguide/…
  • @nikzam,不,也许我应该这样做。任务很短,最长的需要 30 秒。
  • 你可以尝试升级到 django-celery 3.1,djcelery 3.0.24 的测试套件没有通过 Django 1.6
  • @asksol,这似乎不是 Celery 的错误(将很快发布答案/更新),并且 3.1 版本给我的 Django 设置带来了麻烦,所以升级不是很顺利。但是谢谢,我一定会在某个时候升级到 3.1 以避免将来出现问题。

标签: python django celery django-celery django-1.6


【解决方案1】:

事实证明,内存泄漏不是直接由 Django 升级或 Celery 引起的。

经过大量挖掘后,我发现,令人惊讶的是,celery worker 内存泄漏是因为我将 django-debug-toolbar0.9.4 升级到 0.11.0(这是 Django 所需要的) 1.6 兼容性)。

仍然不知道究竟是什么导致了这个问题,或者为什么它只发生在 celery 工作进程而不是应用服务器进程(Gunicorn)中。

从已安装的应用程序和中间件中删除 django-debug-toolbar 可以解决此问题。至少是暂时的。

【讨论】:

    【解决方案2】:

    似乎从 django-debug-toolbar 0.9.40.11.0 的更改确实引入了由存储无限数量消息的 LoggingPanel 引起的内存泄漏。如果您有一个正在使用日志子系统的进程,那么您很可能遇到了这个问题。您还可以从默认面板列表中删除 LoggingPanel 以解决该问题。

    显然在0.9.4 中,仅在访问中间件时才延迟初始化面板。这在 0.11.0 中发生了变化:面板在导入后立即初始化,并且无论是否设置了 DEBUG,LoggingPanel 模块都会拦截所有日志。

    我已经为这个错误提交了a fix

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-18
      • 1970-01-01
      • 1970-01-01
      • 2017-05-11
      • 1970-01-01
      • 2020-07-13
      • 2012-02-09
      • 2013-08-05
      相关资源
      最近更新 更多