Утечки памяти Django 1.6 и Celery 3.0

После обновления Django до 1.6, мой работник сельдерея ел 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 

Происходит в моем локальном env (с DEBUG=False ), который запускает рабочего вручную и в промежуточной среде, где сельдерей работает с Upstart.


Обновления:

  1. Пробовал настройку autocommit=False без успеха.
  2. Может быть, это не связано с обновлением версии Django, но с некоторыми настройками или сторонним пакетом, которые мне пришлось обновить, чтобы перейти на 1.6.

2 Solutions collect form web for “Утечки памяти Django 1.6 и Celery 3.0”

Оказывается, утечка памяти напрямую не вызвана обновлением Django или Celery.

После 0.11.0 я обнаружил, что удивительно, что утечка памяти работника сельдерея происходит из-за того, что я обновил django-debug-toolbar с 0.9.4 до 0.11.0 (что необходимо для совместимости с Django 1.6).

По-прежнему не знаю, что именно вызвало эту проблему, или почему это происходит только в рабочих процессах сельдерея, а не в серверах приложений (Gunicorn).

Проблема django-debug-toolbar удалении django-debug-toolbar из установленных приложений и промежуточного программного обеспечения. По крайней мере временно.

Похоже, что изменение с django-debug-toolbar 0.9.4 до 0.11.0 действительно привело к утечке памяти, вызванной LoggingPanel, сохраняющей бесконечное количество сообщений. Если у вас был процесс, который использовал подсистему ведения журнала, вероятно, вы столкнулись с этой проблемой. Вы также можете удалить LoggingPanel из списка панелей по умолчанию, чтобы обойти эту проблему.

Очевидно, что в 0.9.4 панели были лениво инициализированы только тогда, когда доступ к промежуточному программному обеспечению был достигнут. Это изменилось в 0.11.0 : панели инициализируются сразу после импорта, а модуль LoggingPanel перехватывает все журналы независимо от того, установлен ли DEBUG .

Я представил исправление для этой ошибки.

  • Как проверить статус задачи в сельдерей?
  • Задача сельдерея и настройка декоратора
  • Как я могу запустить периодическую задачу сельдерея из оболочки вручную?
  • Процесс CeleryBeat потребляет всю память ОС
  • Как обеспечить задачу Сельдерея - Предотвращение дублирования задач на сельдерей
  • Остановка супервайзера не останавливает работников сельдерея
  • Почему выполнение запланированных задач с сельдереем предпочтительнее crontab?
  • использование методов класса в качестве задач сельдерея
  • Python - лучший язык программирования в мире.