我在具有 613mb 内存的微型 ec2 实例上将 celery 2.5.1 与 django 结合使用,因此必须降低内存消耗。
目前我仅将其用作 cron 的 Web 界面,用于调度程序“celery beat”,但我希望将来能将其用于更多用途。我注意到,尽管我已将工作程序数量配置为 1,但它仍是我微型计算机上最大的内存消耗者。我在 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
这大约是 214mb 内存(而且共享的不多),偶尔运行一个 cron 作业。我做错了什么吗,或者能以某种方式将其减少大约十倍?;)
更新:这是我的 upstart 配置:
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
答案1
您可以确保 celery 仅包含代码的最低限度(我见过将 celery 配置为导入人们的整个 Web 应用程序……不太好)。但是,最终,您将看到非常大的 Python 块,这本身就会占用大量内存。
如果您想要一个低内存的任务调度工具,我建议使用真正的、诚实的 cron。
答案2
在我提出这个问题几年后,一位同事分享了一个技巧。
基本上,您将应用程序任务分解为单独的脚本,并让 celery 通过子进程运行它。这样,它就可以像 cron 一样定期回收所有应用程序内存。
抱歉,到现在才提到它,该网站只是提醒我存在这个问题。;-)