如何减少 celeryd 内存消耗?

如何减少 celeryd 内存消耗?

我在具有 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 一样定期回收所有应用程序内存。

抱歉,到现在才提到它,该网站只是提醒我存在这个问题。;-)

相关内容