我们有大约300个进程在Ubuntu 10.4 64位下运行,空闲时每个进程占用~19 of,~174 of,因此,对于所有进程来说,空闲内存大约为6GB。在活动状态下,进程占用多达100 In的RES和~300 In的VIRT。
每个进程都使用minidom(xml文件小于500 and,结构简单)和urllib。
问题是--我们怎样才能降低RAM的容量--至少对于闲散的工人来说,一些芹菜或蟒蛇的选择可能会有所帮助。如何确定哪一部分占用了大部分内存?
UPD:是航班搜索代理,一个机构/日期的一名工作人员。我们有10个代理,一个用户搜索== 9日期,因此我们有10*9代理每一个用户的搜索。
是否有可能按需启动celeryd进程以避免空闲工人(类似于apache上的MaxSpareServers )?
UPD2:代理生命周期是-发送HTTP请求,等待响应~10-20秒,解析(所需时间少于0.02s),将结果保存到MySQL
发布于 2010-12-03 17:09:35
请阅读以下内容:
http://docs.celeryproject.org/en/latest/userguide/workers.html#concurrency
听起来你每个芹菜都有一个工人。这似乎不对。你应该有几十个工人。继续增加工人的数量(并降低赛利的数量),直到你的系统非常繁忙和缓慢。
发布于 2010-12-03 19:48:18
罗特是对的。主实例使用消息并将它们委托给员工池进程。在一台机器上运行300个池进程可能是没有意义的!尝试4或5乘以CPU核心的数量。您可以通过运行比在celeryd上多运行几个进程获得一些东西,有些人这样做了,但是您必须为您的应用程序进行实验。
请参阅http://celeryq.org/docs/userguide/workers.html#concurrency
对于即将发布的2.2版本,我们正在研究Eventlet池支持,这可能是IO绑定任务的一个很好的替代方案,这将使您能够以最小的内存开销运行1000+线程,但它仍然是试验性的,并且正在为最终版本修复but。
请参阅http://groups.google.com/group/celery-users/browse_thread/thread/94fbeccd790e6c04
即将发布的2.2版本还支持自动扩展,它根据需要添加/删除过程。请参阅Changelog:http://ask.github.com/celery/changelog.html#version-2-2-0 (此变更日志尚未完整编写)
发布于 2010-12-03 21:21:45
工人的自然数量接近于你拥有的核心数量。工作人员在那里,以便cpu密集型任务能够有效地使用整个核心。代理在那里,这样没有工人在手边处理它们的请求就会排队。队列的数量可能很高,但这并不意味着您也需要大量的代理。一个代理就足够了,或者,如果稍后发现快速的工作队列交互是有益的,那么可以将队列分解到每台机器上的一个代理。
你的问题似乎与此无关。我猜您的代理没有提供消息队列api,而且您必须保持大量的请求。如果是这样的话,您需要一些(强调不是很多)偶发过程,例如基于扭曲或基于node.js的进程。
https://stackoverflow.com/questions/4346318
复制相似问题