Celery - 最小化内存消耗

15 投票
4 回答
24474 浏览
提问于 2025-04-16 07:59

我们在运行大约300个celeryd进程,系统是Ubuntu 10.4 64位。在空闲状态下,每个进程大约占用19MB的实际内存(RES)和174MB的虚拟内存(VIRT),所以所有进程空闲时大约占用6GB的内存。

在活跃状态下,每个进程的实际内存使用量可以达到100MB,虚拟内存大约是300MB。

每个进程使用的是minidom(处理的xml文件小于500KB,结构简单)和urllib。

我们想知道怎么能减少内存消耗,至少是空闲进程的内存,可能有一些celery或python的选项可以帮助?我们怎么才能找出哪个部分占用了最多的内存?

更新:这些是航班搜索代理,每个代理对应一个机构和日期。我们有10个机构,一个用户的搜索对应9个日期,因此每个用户的搜索会有10*9个代理。

有没有可能按需启动celeryd进程,以避免空闲的工作进程(类似于apache中的MaxSpareServers)?

更新2:代理的生命周期是:发送HTTP请求,等待响应大约10-20秒,解析xml(这部分耗时不到0.02秒),然后将结果保存到MySQL。

4 个回答

1

工人的数量最好和你电脑的核心数差不多。工人是用来处理那些需要大量计算的任务的,这样可以让每个核心都充分利用起来。经纪人(broker)则是用来管理那些没有工人可以处理的请求,把它们放在队列里等待处理。虽然队列的数量可以很多,但这并不意味着你需要很多个经纪人。一个经纪人就够用了,或者如果你发现快速的工人与队列之间的互动很重要,可以把队列分配到每台机器上的一个经纪人。

你的问题似乎和这个没什么关系。我猜你的服务提供商没有提供消息队列的接口,所以你需要处理很多请求。如果是这样的话,你只需要几个(强调一下,不是很多)基于事件的进程,比如用 twisted 或者 node.js。

3

S. Lott说得对。主要的实例负责接收消息,并把这些消息分配给工作池中的进程。其实在一台机器上运行300个进程是没什么意义的!可以尝试运行4到5个进程,数量可以根据你的CPU核心数来乘算。虽然有些人发现运行多个celeryd,每个有几个进程可能会有好处,但这需要你根据自己的应用进行实验。

详细信息可以查看 这个链接

在即将发布的2.2版本中,我们正在开发Eventlet池的支持,这可能是处理IO密集型任务的一个不错选择,它能让你以很小的内存开销运行1000多个线程,但目前仍在实验阶段,最终版本会修复一些bug。

更多信息请查看 这个链接

即将发布的2.2版本还支持自动扩展,可以根据需求增加或减少进程。详细更新内容请查看变更日志:这个链接(这个变更日志还没有完全写好)

8

看看这个:

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

听起来你每个celeryd只用了一个工作者,这样似乎不太对。其实每个celeryd应该有好几个工作者。你可以不断增加工作者的数量,同时减少celeryd的数量,直到你的系统变得非常忙碌和很慢为止。

撰写回答