Celery - 降低内存消耗

15
我们在Ubuntu 10.4 64位系统上运行了大约300个celeryd进程。 在空闲状态下,每个进程占用约19MB的RES和~174MB的VIRT,因此所有进程在空闲时占用了约6GB的RAM。 在活动状态下,进程会占用多达100MB的RES和~300MB的VIRT。
每个进程都使用minidom(xml文件大小小于500KB,结构简单)和urllib。
问题是如何减少RAM消耗-至少对于空闲的工作者来说,可能一些celery或python选项可以帮助? 如何确定哪部分占用了大部分内存?
更新:这是航班搜索代理,每个机构/日期一个工作程序。 我们有10个机构,一个用户搜索== 9个日期,因此我们有10 * 9个代理程序与一个用户搜索相关联。
是否可以按需启动celeryd进程以避免空闲的工作程序(类似于apache的MaxSpareServers)?
更新2:代理生命周期是-发送HTTP请求,等待响应约10-20秒,解析xml(耗时不到0.02秒),将结果保存到MySQL。

你尝试过 serverfault.com 或在 irc.freenode.net 上的 #celery 频道吗? - Unreason
serverfault很遗憾是空的。 - Andrew
2
为什么有这么多空闲的 celeryd 服务器? - S.Lott
1
@S.Lott:+1,我有一个使用仅8个工作进程的大型通讯简报,我可以每小时发送500k条消息。很难想象需要这么多工作进程的应用程序。 - Paulo Scardine
@Andrew:(1)请更新您的问题,不要添加评论。(2)为什么这么多?如果它们超过50%的时间处于空闲状态,那么您拥有的服务器数量是所需数量的两倍,对吗?为什么还会有任何空闲服务器呢? - S.Lott
显示剩余3条评论
4个回答

8

@Paulo Scardine说:“每个工作进程都会生成一个新的celeryd实例。” 这似乎不正确,因为文档建议“例如3个具有每个10个工作进程的celeryd”。 - S.Lott
1
我在我的服务器上运行“ps”命令,至少使用djcelery,我可以看到一个主要的celeryd实例和每个worker都有一个。 - Paulo Scardine
@Paulo Scardine:我认为文档只是在谈论主要实例。但我不确定100%。此时,您应该更仔细地阅读celery文档,以了解如何进行配置。 - S.Lott
@Paulo Scardine:我很抱歉无法百分之百确定。在我的世界里,很少有事情是百分之百确定的。或许你对某些事情有更好的了解和经验,可以完全正确地判断。我不知道你的配置情况。我不知道你为设置celery做了哪些工作,也不知道你如何使用它。由于我没有任何事实可以基于来评论你所看到的情况,我实际上无法对此进行评论。缺乏事实使得回应你的评论非常非常困难。然而,我提供的链接似乎提供了有用的信息。或许你可以阅读一下? - S.Lott

3
S. Lott是正确的。主要实例消耗消息并将其委托给工人池进程。在单台机器上运行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 (此更改日志尚未完全编写)

我们运行了300个工作进程,因为它们都执行长时间的HTTP请求,所以它们会一直保持繁忙状态,直到收到HTTP响应。有没有更正确的方法来解决这个问题? - Andrew
1
正如我所说,Celery主分支中的eventlet支持在这种类型的应用程序中更加出色。有可能,您使用300个进程和15个进程一样不会收到更多的请求/秒。 (如果您有8个核心),更有可能的是性能会更差,因为它将是上下文切换垃圾回收。 - asksol

1

自然数的工人数量应该接近您拥有的核心数量。工人存在是为了使cpu密集型任务能够有效地使用整个核心。经纪人存在是为了保持没有工人来处理请求的情况下保持排队。队列的数量可以很高,但这并不意味着您需要有很多经纪人。一个经纪人就足够了,或者如果后来发现快速的工人-队列交互是有益的,您可以将队列分片到每台机器上的一个经纪人。

您的问题似乎与此无关。我猜你的机构没有提供消息队列api,而你必须保留大量的请求。如果是这样,您需要一些(强调不是很多)基于twisted或node.js的事件驱动进程。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接