芹菜 - 减少内存消耗

时间:2010-12-03 14:08:47

标签: python django profiling memory-management celery

我们有大约300个celeryd进程在Ubuntu 10.4 64位下运行,在空闲时每个进程需要~19mb RES,~174mbV VIRT,因此 - 对于所有进程来说,空闲时大约有6GB RAM。 在活动状态 - 过程需要高达100mb的RES和~300mbV VIRT

每个进程都使用minidom(xml文件< 500kb,简单结构)和urllib。

排队是 - 我们如何减少RAM的消耗 - 至少对于闲置工人来说,可能一些芹菜或python选项可能会有所帮助? 如何确定哪个部分占用了大部分内存?

UPD:这就是航班搜索代理商,一个代理商/日期的工作人员。我们有10个代理商,一个用户搜索== 9个日期,因此我们每个用户搜索有10 * 9个代理商。

是否有可能按需启动celeryd进程以避免空闲工作(类似于apache上的MaxSpareServers)?

UPD2:代理生命周期是 - 发送HTTP请求,等待响应~10-20秒,解析xml(少于0.02秒),将结果保存到MySQL

4 个答案:

答案 0 :(得分:5)

阅读本文:

http://docs.celeryproject.org/en/latest/userguide/workers.html#concurrency

听起来你每个芹菜有一个工人。这似乎是错的。每个芹菜应该有几十个工人。继续增加工人数量(并减少芹菜的数量),直到你的系统非常繁忙且非常慢。

答案 1 :(得分:2)

S上。洛特是对的。主实例使用消息并将它们委托给工作池进程。在一台机器上运行300个池进程可能没有意义!尝试4或5乘以CPU核心数。你可以通过运行比celeryd更多的东西来获得一些东西,每个都有一些进程,但是你必须为你的应用进行实验。

请参阅http://celeryq.org/docs/userguide/workers.html#concurrency

对于即将发布的2.2版本,我们正在研究Eventlet池支持,这可能 是IO绑定任务的一个很好的替代方案,可以让你运行1000多个线程 最小的内存开销,但它仍然是实验性的,错误正在修复 最终版本。

请参阅http://groups.google.com/group/celery-users/browse_thread/thread/94fbeccd790e6c04

即将发布的2.2版本也支持自动缩放,可根据需要添加/删除流程。请参阅更改日志: http://ask.github.com/celery/changelog.html#version-2-2-0  (此更改日志尚未完整编写)

答案 2 :(得分:1)

工人的自然人数接近你拥有的核心数量。工作人员在那里,因此cpu密集型任务可以有效地使用整个核心。经纪人在那里,以便那些没有工人来处理它们的请求保持排队。队列数量可能很高,但这并不意味着您需要大量的经纪人。单个代理应该足够,或者如果稍后证明快速的工作队列交互是有益的,你可以将每个机器的队列分成一个代理队列。

你的问题似乎与此无关。我猜你的代理商没有提供消息队列api,你必须保留很多请求。如果是这样,你需要一些(强调不多)的事件进程,例如twisted或node.js。

答案 3 :(得分:1)

使用自动缩放。这允许每个芹菜实例下的工人数量根据需要增加或减少。 http://docs.celeryproject.org/en/latest/userguide/workers.html#autoscaling