我们编写了一个应用程序,通过电子邮件向我们客户的 200,000 多个客户发送账单信息。
目前,我们使用的是批处理程序,需要 2 天多的时间才能按顺序发送所有电子邮件。
我们已将整个程序转移到 Celery,并且我们已经在常规 2 个工作负载上看到了一些显着的改进。
有人对 Celery 进行过基准测试吗?
文档指出,为了提高性能,worker 的数量必须等于 CPU 的数量。假设我们虚拟化服务器并在物理 8 核服务器上设置 32 个 vCPU,我们可以以 32 线程并发运行它吗?
邮件通过不同的邮件服务器发送,服务器仅运行 Rabbit MQ、Celery 和应用程序。
请告知正确的工作线程、线程和 vcpu 数量,以避免不必要的排队和延迟。
谢谢!
最佳答案
简短回答:您需要了解自己在做什么,并可能自己进行衡量
更长:
主要问题是您的任务是否受 CPU 限制或 I/O(网络/磁盘)限制。如果您的任务受 CPU 限制(可能是生成模板、图像等任务),则通过添加工作线程不会获得任何改进。然而,大多数情况下,您正在执行 I/O 绑定(bind)(网络)任务,并且如果您正在等待网络确认,并且邮件服务器等不存在瓶颈,那么您可能能够通过使用更多工作线程来获得更高的结果。
为了更好地理解这一点,我强烈建议您慢慢浏览 David Beazley 令人大开眼界的演示:An Introduction to Python Concurrency 。这不包括 Celery 和 Tornado,但很好地概述了底层技术和问题,并列出了解决方案(带有示例)。
关于Python Celery 线程、工作线程和 vCPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21516404/