Назад | Перейти на главную страницу

Как уменьшить потребление памяти сельдереем?

Я использую celery 2.5.1 с django на экземпляре micro ec2 с памятью 613 МБ, и поэтому мне нужно снизить потребление памяти.

В настоящее время я использую его только для планировщика "сельдерейный ритм" в качестве веб-интерфейса для cron, хотя я надеюсь использовать его для других целей в будущем. Я заметил, что это самый большой потребитель памяти на моей микромашине, хотя я настроил количество рабочих на одного. У меня не так много других параметров, установленных в settings.py:

import djcelery
djcelery.setup_loader()
BROKER_BACKEND = 'djkombu.transport.DatabaseTransport'
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
CELERY_RESULT_BACKEND = 'database'

BROKER_POOL_LIMIT = 2
CELERYD_CONCURRENCY = 1
CELERY_DISABLE_RATE_LIMITS = True
CELERYD_MAX_TASKS_PER_CHILD = 20
CELERYD_SOFT_TASK_TIME_LIMIT = 5 * 60
CELERYD_TASK_TIME_LIMIT = 6 * 60

Вот подробности сверху:

 PID USER  NI CPU%  VIRT   SHR  RES  MEM% Command 
1065 wuser 10  0.0  283M  4548  85m  14.3 python manage_prod.py celeryd --beat
1025 wuser 10  1.0  577M  6368  67m  11.2 python manage_prod.py celeryd --beat
1071 wuser 10  0.0  578M  2384  62m  10.6 python manage_prod.py celeryd --beat

Это около 214 МБ памяти (и не очень много совместно используемой) для периодического выполнения задания cron. Я что-то сделал не так, или это можно как-то уменьшить примерно в десять раз? ;)

Обновить: вот мой конфиг выскочки:

description "Celery Daemon"

start on (net-device-up and local-filesystems)
stop on runlevel [016]
nice 10
respawn
respawn limit 5 10
chdir /home/wuser/wuser/
env CELERYD_OPTS=--concurrency=1

exec sudo -u wuser -H /usr/bin/python manage_prod.py celeryd --beat --concurrency=1 --loglevel info --logfile /var/tmp/celeryd.log

Обновление 2:

Я заметил, что есть один корневой процесс, один дочерний процесс пользователя и два внука от него. Так что я думаю, дело не в дублировании запуска.

root  34580  1556 sudo -u wuser -H /usr/bin/python manage_prod.py celeryd 
wuser  577M 67548 └─ python manage_prod.py celeryd --beat --concurrency=1 
wuser  578M 63784    ├─  python manage_prod.py celeryd --beat --concurrency=1
wuser  271M 76260    └─  python manage_prod.py celeryd --beat --concurrency=1

Вы можете убедиться, что сельдерей включает только минимум вашего кода (я видел сельдерей, настроенный для импорта целых веб-приложений людей ... не очень красиво). Однако, в конце концов, вы смотрите на очень большой кусок Python, который по самой своей природе будет поглощать много памяти.

Если вам нужен инструмент планирования задач с низким объемом памяти, я бы посоветовал настоящий, добротный cron.

Коллега поделился трюком через пару лет после того, как я задал этот вопрос.

По сути, вы выделяете задачу приложения в отдельный сценарий, а сельдерей запускает его через подпроцесс. Таким образом, он может регулярно освобождать всю память приложения, как это сделал бы cron.

Извините, я не упомянул об этом до сих пор, сайт просто напомнил мне, что вопрос существует. ;-)