如何在将shoryuken用于后台作业时确定并发(线程)?

时间:2017-02-08 13:48:11

标签: ruby-on-rails multithreading concurrency background-process shoryuken

在我的Ruby on Rails应用程序中,我使用shoryouken进行后台处理。我的应用程序中有很多sqs队列(6-7)。其中一个队列有2000-3000个作业,工作人员需要大约3个小时来处理这些2-3k个作业,默认并发数为25.因此,根据哪些因素,我们可以决定增加并发性(即处理作业的线程)。如果问题中有任何不清楚的地方,请发表评论。

2 个答案:

答案 0 :(得分:5)

Concurrency defaults to 25,但可以通过更改shoryuken.yml配置(见下文)或添加并发参数来更改:shoryuken -c {desiredCount}

concurrency: 25  # Update with your desired value.
delay: 25        # The delay in seconds to pause a queue when it's empty. Default 0
queues:
  - [high_priority, 6]
  - [default, 2]
  - [low_priority, 1]

随着并发线程数量的增加,您将需要测试性能的最佳值,因为您会遇到I / O和CPU瓶颈。一旦达到了实例的最佳值,您就需要增加运行此作业的实例数或升级实例。

如果瓶颈存在于您的数据库或其他资源上,您需要相应地进行调整。 (不太可能是这种情况,但为了彻底而包括在内)

编辑:优化性能

在回答有关优化线程数的问题时,确定最佳并发值的最快/最佳方法是更改​​并发性并测量实际吞吐量。还有其他方法,但性能的黄金法则总是在实时生产环境中进行衡量。合成基准仅在它们反映实时性能的范围内有所帮助。 (另见:premature optimization)。

在这种情况下,你可以很容易地结束过度思考(然后再次,过度思考事物是一个长期存在的问题)。只需使用适当的指标(CPU利用率,内存利用率,每分钟完成的作业数)进行衡量,并更改线程数,直到最大化吞吐量或遇到瓶颈为止。

如果您的任务受CPU限制,您将看到最大化CPU利用率。如果您的任务受到I / O限制,那么即使您的CPU利用率未能上升,但在某些时候,并发线程的增加不会转化为吞吐量的增加。

当您正在读取/写入的任何资源无法满足您的CPU需求时,可能会发生I / O瓶颈。这包括系统资源(内存,磁盘空间),数据库性能(DB CPU利用率,读/写限制)以及您要连接的其他API。网络容量也是一个理论上的瓶颈,但如果它足够大,就可以聘请有这方面经验的人。因为有这么多不同的方法可以实现,所以找出瓶颈的唯一真正方法就是让你的监控到位。

Re:公式,简短的回答是,在这种情况下,你可以使用没有一个公式。很长的答案可能是肯定的,但在收集您计算所需的所有值时,您将达到最佳值。

编辑2:并发,延迟和吞吐量

我意识到我忘了补充一条建议。当您处理用户不等待的后台任务时,您的吞吐量(每单位时间的作业)是您要优化的唯一事物。不要针对个人工作时间进行优化。这也意味着您无法分析当前(并且可能是未绑定的)性能并获得有用的数据,因为瓶颈/约束是依赖于目标的。吞吐量存在的约束与单个任务时间存在的约束不同。

(从技术上讲,你的并发设置是你当前的约束)

答案 1 :(得分:1)

三个主要因素是

  1. 核心数量
  2. 作业类型 - I / O或CPU绑定
  3. 是否有其他应用程序或进程在服务器上运行
  4. 理想情况下,对于cpu绑定任务,请将线程数保持为cpu核心数。

    对于I / O绑定任务,它需要基准测试并计算I / O的等待时间,然后您可以确定最佳值。对于粗略估计,如果您有4个核心而不是I / O绑定任务,则必须保持最多8个线程。

    如果您的rails应用程序运行相同,那么您将需要减少核心数量。

    如果系统不支持,增加内核数量不会提高性能。

    参考:http://baddotrobot.com/blog/2013/06/01/optimum-number-of-threads/