Python Celery线程,工作者和虚拟CPU

3
我们编写了一个应用程序,向我们客户的超过200,000个客户通过电子邮件发送账单信息。
目前,我们使用的批处理程序需要超过2天的时间以顺序方式发送所有电子邮件。
我们已经将整个程序转移到Celery上,并且在常规2个工作者负载下已经看到了一些显着的改进。
有人对Celery进行过基准测试吗?
文档指出,性能需要将worker数量等于CPU数量。假设我们在物理8核服务器上虚拟化服务器并设置32个vCPUs,那么我们可以以32个线程并发运行吗?
这些邮件是通过不同的邮件服务器发送的,该服务器仅运行Rabbit MQ、Celery和应用程序。
请建议正确的worker数量、线程数量和vCPU数量,以避免不必要的排队和延迟。
谢谢!
1个回答

4

简短回答:你需要理解自己在做什么,并可能要自行进行测量。

更详细的解释:

主要问题是你的任务是否为CPU密集型或I/O(网络/磁盘)密集型。如果你的任务是CPU密集型(可能是生成模板、图像等内容),添加工作者不会带来任何改善。然而,大多数情况下,你的任务是I/O密集型(网络),如果你正在等待网络确认,并且邮件服务器没有瓶颈等问题,你可能能够通过使用更多的工作者获得更高的结果。

为了更好地理解这一点,我强烈建议你慢慢阅读David Beazley在此处提供的启发性演示:Python并发介绍。这并不涵盖Celery和Tornado,但是提供了对基础技术和问题的优秀概述,并且也提供了解决方案(带有示例)。


谢谢。没有网络等待。一切都更多或少是I/O绑定和数据库绑定。vCPUs与并发线程数量之间有什么比率吗?根据您的建议,我正在慢慢地浏览演示文稿。 - ramdaz
1
如果它是SQLDB绑定的(即,您的任务直接写入DB,并且这些导致进程延迟),您可能希望考虑在创建任务时将所有内容读取到进程中,通过事件Q将其发送给多个工作程序,并通过消息Q结果后端返回结果,稍后由一个顺序DB编写工作程序写入DB。这样,您可以使您的任务100%网络绑定并创建更多的工作程序,或者将其重写为完全异步(例如使用tornado),并使用每个CPU一个工作程序。无论如何,没有“魔法数字”,您应该看一下幻灯片 :-) - Udi
1
如果您的任务受输入/输出限制,您还可以使用eventlet/gevent池:celery worker -l info -P gevent -c 1000。如果您有32个CPU,则可以使用celery multi来充分利用它们:celery multi start 32 -P eventlet -c 100,每个进程有32个工作线程,并发数为100。 - asksol

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