我正在我的web应用程序上进行一些度量分析,该应用程序大量使用了芹菜。我有一个度量标准,它测量从postrongave信号通过一个芹菜任务(它本身调用了许多不同的芹菜任务)到该任务结束的全程。我已经在5秒内处理了多达100个请求。
我发现有趣的是,当我在服务器上收到数百个请求时(这需要数千个芹菜工作进程排队),从保存后到主芹菜任务结束所需的时间会显著增加,尽管我从未进行任何额外的数据库调用,并且任何芹菜任务都不应该阻塞主任务。
当我发出一堆请求时,队列中有这么多芹菜任务,这是否真的会减慢postrongave函数和主芹菜任务中的逻辑?也就是说,将主芹菜任务创建的子任务放到拥挤的队列中的相关处理是否会对到达主芹菜任务末尾所需的时间产生重大影响?
如果不深入分析您的实际代码和基准测试协议,就不可能真正回答您的问题,尽管我在Python、Django和Celery方面有一些工作经验,但我无法进行如此深入的分析。现在有几个非常明显的点:
-
如果你的工人和你的Django实例在同一台计算机上运行,他们将与Django进程争夺CPU、RAM和IO。
-
如果基准测试"客户端"也在同一台计算机上运行,那么就会出现"heisenbench"的情况——用每秒100秒的HTTP请求轰炸服务器也会占用大量资源。。。
长话短说:并发/并行编程不会给你更多的处理能力,它只会让你(或多或少)轻松地横向扩展。
我不确定是否会减慢速度,但这可能会导致应用程序挂起。我遇到过这样的问题,一个应用程序会备份其他几个队列,而没有工作者。然后,我的应用程序无法再对消息进行排队。
如果您打开一个django shell并尝试对任务进行排队。然后按ctrl+c。我不太记得堆栈跟踪应该是什么,但如果你把它贴在这里,我可以确认