如何自动扩大/缩小工人?

时间:2012-06-08 20:14:36

标签: c# multithreading scalability worker

如何自动扩展工作人员任务?

我有一个应用程序,我想自动扩展工作任务的数量,以适应​​要处理的项目的吞吐量(显然最大限度地限制了工作人员)。

所有要处理的项目都通过一个点进行路由,从中分配工作任务(现在我找到队列最短的工作人员,并将项目排入队列)。

用什么样的好模式或技术来做出一些明智的决定,决定我应该开多少工人来处理这些物品?如果项目能够由较少的工人及时处理,则该逻辑需要包括关闭工人。

我意识到增加更多工人将无法无限扩展,因为最终其他资源将受到瓶颈,并且在某些时候增加更多工人会伤害更多而不是帮助。如果我可以解释这一点,并决定缩小DOWN工人的数量以自动找到“甜蜜点”,这将是太棒了,但是在这一点上,如果我的系统可以增加工人的数量,我会很高兴添加更多项目,然后减少数量,因为需要更少的项目。

我玩弄的一个想法是测量一个项目在队列中的平均时间。如果这个平均时间大于几秒钟,我应该增加更多的工人(直到达到设定的最大限制)。如果平均时间少于1秒,我应该减少更多的工作人员(直到当然只剩下一个)。

有没有人对最佳方法有任何建议?

2 个答案:

答案 0 :(得分:0)

除非你可以将工作分解成可以在工人中分配的块,否则你将无法扩展。你如何分配这项工作实际上取决于你如何分解工作。如果你将工作细分为较小的块,其结果在完成后合并,那么map / reduce模式可能符合要求......

无论你做什么,要记住的一件事是,只要你运行的线程多于CPU,你的性能就会大幅降低。这是因为你增加/引入了非常昂贵的上下文切换。使用TPL和PLINQ之类的东西可以让你安排任务并避免这个问题。

答案 1 :(得分:0)

您还可以计算每秒排队任务数的全局运行平均值,并除以一个工作人员可以处理的每秒最大任务数。这将为您提供不落后的工人数量。

你还想引入一个延迟,(如果是x秒,则需要增加的工人数量减少)(如果x秒,则需要更多的工人减少)。

这假设所有任务都需要相同的时间来处理,并且所有工作人员都具有相同的吞吐量。