11

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

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

问题是 - 我们如何减少 RAM 消耗 - 至少对于空闲的工人来说,可能一些 celery 或 python 选项可能会有所帮助?如何确定哪个部分占用内存最多?

UPD:那是航班搜索代理,一个机构/日期的一名工人。我们有 10 个代理,一个用户搜索 == 9 个日期,因此每个用户搜索我们有 10*9 个代理。

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

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

4

4 回答 4

6

读这个:

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

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

于 2010-12-03T17:09:35.013 回答
2

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 (此变更日志尚未完整编写)

于 2010-12-03T19:48:18.993 回答
1

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

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

于 2010-12-03T21:21:45.347 回答
1

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

于 2013-09-20T16:16:56.807 回答