我们有大约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
答案 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