我们在 Ubuntu 10.4 64 位下运行了约 300 个 celeryd 进程,空闲时每个进程占用约 19mb RES、约 174mb VIRT,因此,所有进程在空闲时大约占用 6GB RAM。在活动状态下,进程占用高达 100mb RES 和约 300mb VIRT
每个过程都使用 minidom(xml 文件 < 500kb,结构简单)和 urllib。
问题是 - 我们如何才能减少 RAM 消耗 - 至少对于闲置的工作者来说,一些 celery 或 python 选项可能会有所帮助?如何确定哪一部分占用了大部分内存?
答案1
看一下子类化AutoScaler
类并min_concurrency
在中设置变量__init__
。默认的 min_concurrency 为 0,阻止默认的 AutoScaler 缩小。
我还没有测试过此类(我的 Celery 测试节点已关闭)但类似下面的操作应该可以工作:
from celery.worker.autoscale import Autoscaler
class MinIdleAutoscaler(Autoscaler):
def __init__(self,pool, max_concurrency, min_concurrency=10, keepalive=30, logger=None):
Autoscaler.__init__(self,pool,max_concurrency,min_concurrency,keepalive,logger)
然后,您可以通过设置来告诉 Celery 使用此类CELERYD_AUTOSCALER
在你的 Celery 配置中。