STLEON
@STLEON
In Console We Trust. Code hard. Or die.

Как избавиться от утечки памяти в связке Django+Celery?

Django 1.7.7, Celery 3.1.17, supervisor, rabbitmq.

Проблема в том, что воркеры выполняют таски, но оперативная память не освобождается.

Пробовал

CELERYD_TASK_TIME_LIMIT = 600,
CELERY_TASK_RESULT_EXPIRES = 360,

Но ситуация все равно не меняется.

user    1066  0.0  7.9 214576 41716 ?        S    16:09   0:10 project/manage.py celery beat -s project/celerybeat-schedule
user    1067  0.0  8.2 138876 43032 ?        S    16:09   0:17 project/manage.py celeryd --concurrency=1
user    1068  0.0  7.0 258700 37012 ?        Sl   16:09   0:11 project/manage.py celerycam --frequency=10.0
user    1090  0.0 13.0 250740 68220 ?        S    16:09   0:13 project/manage.py celeryd --concurrency=1

И с каждым разом они едят все больше и больше RAM. Задания очень простые - отправка почты, работа с бд.

Как можно решить эту проблему?

Спасибо!
  • Вопрос задан
  • 1554 просмотра
Пригласить эксперта
Ответы на вопрос 2
dizballanze
@dizballanze
Software developer at Yandex
Можно установить параметр CELERYD_MAX_TASKS_PER_CHILD, чтобы раз в определенное количество выполненных заданий процесс воркера пересоздавался, в таком случае память будет очищаться. Но у вас явно где-то в коде есть утечки памяти, иначе воркеры бы не съедали столько памяти со временем.
Ответ написан
sim3x
@sim3x
stackoverflow.com/a/22844509/1346222
A process will never free memory addressing space once it has requested it from the OS


или
stackoverflow.com/a/17561747/1346222
https://github.com/celery/celery/issues/1427
CELERYD_TASK_TIME_LIMIT = 600

или можно килять по крону

Настоящим решением будет настройка лимитов через lxc
https://blog.codeship.com/lxc-memory-limit/
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы