Я использую 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.
Извините, я не упомянул об этом до сих пор, сайт просто напомнил мне, что вопрос существует. ;-)