Python 芹菜-最大限度地减少内存消耗

Python 芹菜-最大限度地减少内存消耗,python,django,profiling,memory-management,celery,Python,Django,Profiling,Memory Management,Celery,我们有大约300个celeryd进程在Ubuntu 10.4 64位下运行,在空闲状态下,每个进程需要大约19mb的资源,大约174mb的虚拟内存,因此,对于所有进程来说,空闲状态下大约有6GB的RAM。 处于活动状态-进程占用高达100mb的RES和~300mb的VIRT 每个进程都使用minidom(xml文件小于500kb,结构简单)和urllib 问题是——我们如何减少RAM消耗——至少对于空闲的工作人员来说,也许一些芹菜或python选项会有所帮助? 如何确定哪个部分占用了大部分内存

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

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

问题是——我们如何减少RAM消耗——至少对于空闲的工作人员来说,也许一些芹菜或python选项会有所帮助? 如何确定哪个部分占用了大部分内存


UPD:这是航班搜索代理,一个代理/日期对应一名员工。我们有10个代理,一个用户搜索==9个日期,因此我们每个用户搜索有10*9个代理

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

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

阅读以下内容:


听起来好像每个芹菜都有一个工人。这似乎是错误的。每个芹菜园应该有几十个工人。不断增加工作人员的数量(并降低celeryd的数量),直到您的系统非常繁忙且非常缓慢。

s。洛特是对的。主实例使用消息并将它们委托给工作池进程。在一台机器上运行300个池进程可能没有意义!尝试4或5乘以CPU核心数。通过在celeryd上运行多个进程(每个进程都有几个进程),您可能会有所收获,但您必须为您的应用程序进行实验

对于即将发布的2.2版本,我们将于今年5月提供Eventlet池支持 是IO绑定任务的一个很好的替代方案,它将使您能够运行1000多个线程 内存开销最小,但仍处于试验阶段,错误正在修复中 对于最终版本

即将发布的2.2版本还支持自动缩放,可根据需要添加/删除流程。请参阅更改日志:
(此更改日志尚未完全编写)

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


你的问题似乎与此无关。我猜您的代理机构不提供消息队列api,您必须保留大量请求。如果是这样,您需要一些(强调的不是很多)事件化进程,例如twisted或node.js。这允许根据需要增加或减少每个celeryd实例下的工作人员数量

你试过irc.freenode.net上的serverfault.com或#芹菜吗?serverfault是空的,不幸的是为什么有这么多空闲的
celeryd
servers?@S.Lott:+1,我有一个大的时事通讯,只用了8个工作人员,我每小时可以发送500条消息。很难想象一个应用程序需要这么多员工。这就是航班搜索代理,一个员工代表一个机构/日期。我们有10个代理,一个用户搜索==9个日期,因此每个用户有10*9个代理search@Paulo斯卡丁:“每个工人产生一个新的芹菜实例”。当文档建议“例如3个celeryd,每个进程有10个工作进程”时,这似乎是不对的。我在我的服务器上运行“ps”,至少在djcelery上,我看到一个主celeryd实例+每个工作进程一个。@Paulo Scardine:我想文档只讨论了主实例。但我不是100%肯定。此时,您可能应该更仔细地阅读芹菜文档,看看它是如何配置的。@Paulo Scardine:我很抱歉不能100%确定。在我的世界里,很少有事情是100%确定的。也许你在某些事情上完全正确方面有更好的经验。我不知道你的配置。我不知道你做了什么来准备芹菜,也不知道你是怎么用的。我真的无法对你所看到的进行评论,因为我没有任何事实作为我评论的基础。由于缺乏事实,很难对你的评论作出回应。然而,我提供的链接似乎提供了有用的信息。也许你可以读一下?我们运行了300个worker,因为他们都执行长http请求,因此在收到http响应之前他们都很忙。有没有更正确的方法来解决这个问题?正如我所说的,Cellery master中的eventlet支持在这类应用程序中要好得多。与使用15个进程相比,使用300个进程不会收到更多的请求。(如果您有8个内核),那么您的性能很可能会降低,因为这会破坏上下文切换。