芹菜仅使用20%的Cpu(在峰值时)

时间:2019-10-18 12:31:38

标签: concurrency rabbitmq load celery cpu

我正在运行芹菜+ Rabbitmq应用程序。我启动了一堆ec2机器,但是我发现我的celery worker机器仅使用大约15%的cpu(峰值为20%)。我已经为每台机器配置了2个芹菜工人。

芹菜工人不应该接近100%使用CPU吗?

更多信息:即使我使用多个工作程序,我也没有使用celery --concurrency选项或eventlet。默认情况下,并发性设置为8。我的任务大多在php中进行io阻止,因此,如果我们有更多并行运行的进程,就不会有问题。有什么方法可以将celery配置为根据CPU使用情况运行更多任务

2 个答案:

答案 0 :(得分:0)

您有两个选择-增加concurrency level(使用--concurrency)或使用(不建议使用的)auto-scaling option。在大多数情况下,我们通过使用2 * N的并发设置数在AWS上过度利用,其中N是您选择的实例类型上的vCPU数量。我们不会过度利用订阅了特殊队列的节点,这些特殊队列将在其中发送CPU绑定的任务。

答案 1 :(得分:0)

芹菜工作者不是应该接近100%使用CPU吗?

仅当您加载它们以使用100%CPU时:)

我的任务大多在php中运行io阻止

如果您的任务主要是进行IO调用,则这很可能是CPU不高的原因。也就是说,在进行io调用并等待其完成后,进程/头通常处于空闲状态。

基准测试配置至关重要。实际上,它看起来像:

  • 选择并发的初始级别(即默认级别)
  • 基准吞吐量/资源使用量
  • 提高并发级别
  • 基准吞吐量/资源使用情况
  • 继续,直到并发性增加不再提供任何好处

如果您的工作者任务受IO约束,那么这是eventlet的完美案例。因为它将允许您在单个处理器上运行许多IO绑定任务。即考虑您的计算机具有64核的情况。您应该可以轻松地为IO绑定的任务运行多个此函数,但是在某些时候,大部分资源将用于处理记帐,开销和上下文切换。

使用eventlet,单个处理器可以处理数百或数千个并发工作器:

  

prefork池可以使用多个进程,但是有多少个   通常每个CPU限于几个进程。有了Eventlet,您可以   有效地产生数百或数千个绿色线程。在一个   使用Feed Hub系统进行非正式测试,Eventlet池可以获取并   每秒处理数百个饲料,而前叉池却花了   14秒内处理100个Feed。请注意,这是   应用程序异步I / O特别擅长(异步HTTP   要求)。您可能需要兼有Eventlet和prefork工人,   并根据兼容性或最佳方式路由任务。