6

将 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 方包有关。
4

2 回答 2

7

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

经过大量挖掘后,我发现,令人惊讶的是,celery worker 内存泄漏的发生是因为我将django-debug-toolbar从升级0.9.40.11.0(这是 Django 1.6 兼容性所必需的)。

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

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

于 2013-11-12T14:03:42.657 回答
1

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

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

我已经提交了针对此错误的修复程序。

于 2014-03-16T08:45:38.883 回答