我正在运行芹菜+ Rabbitmq应用程序。我启动了一堆ec2机器,但是我发现我的celery worker机器仅使用大约15%的cpu(峰值为20%)。我已经为每台机器配置了2个芹菜工人。
芹菜工人不应该接近100%使用CPU吗?
更多信息:即使我使用多个工作程序,我也没有使用celery --concurrency选项或eventlet。默认情况下,并发性设置为8。我的任务大多在php中进行io阻止,因此,如果我们有更多并行运行的进程,就不会有问题。有什么方法可以将celery配置为根据CPU使用情况运行更多任务
答案 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工人, 并根据兼容性或最佳方式路由任务。