“偷工作”与“工作耸肩”?

时间:2010-03-31 12:25:52

标签: terminology scheduling load-balancing scheduled-tasks multiprocessor

为什么我能找到很多关于“工作窃取”的信息,而没有关于“工作耸肩”的信息作为动态负载均衡策略?

通过“工作耸肩”我的意思是将多余的工作从忙碌的处理器推送到负载较少的邻居,而不是让空闲的处理器从忙碌的邻居中拉工作(“工作-stealing“)。

我认为两种策略的一般可扩展性应该相同。但是我相信它在延迟和延迟方面更有效率。功耗,在确实有工作要做的时候唤醒空闲处理器,而不是让所有空闲处理器周期性地轮询所有邻居以进行可能的工作。

无论如何,一个快速的谷歌没有出现在“工作耸肩”或类似标题下的任何内容,所以任何指向现有技术的指针和这个策略的行话都是受欢迎的。

澄清

我实际上设想工作提交处理器(可能是也可能不是目标处理器)负责查看首选目标处理器的直接位置(基于数据/代码位置)决定是否应该给近邻做新工作,因为他们没有那么多的工作要做。

我认为决策逻辑在这里需要的不仅仅是对立即(通常是2到4个)邻居的估计q长度的原子读数。我不认为这比盗贼民意调查所暗示的更多耦合。偷走邻居。 (我在两种策略中都假设“无锁,无等待”队列)。

分辨率

似乎我的意思(但只是部分描述!)作为“工作耸肩”策略是在“正常”的前期调度策略的领域,恰好处理器,缓存和记忆忠诚,可扩展。

我发现有很多参考文献在这些条款上进行搜索,其中一些看起来非常可靠。当我发现一个最符合(或拆除!)逻辑的时候,我会发布一个引用,我的定义是“工作耸肩”。

6 个答案:

答案 0 :(得分:18)

负载均衡不是免费的;它具有上下文切换(到内核),查找空闲处理器以及选择重新分配工作的成本。特别是在任务一直切换的机器中,每秒数十次,这个成本加起来。

那有什么区别?工作耸肩意味着您进一步负担过度配置资源(繁忙的处理器)负担均衡负担。为什么当隔壁的处理器没有任何关系时,用administrivia中断繁忙的处理器?另一方面,工作窃取使空闲处理器运行负载均衡器,而繁忙的处理器继续工作。偷工作可以节省时间。

实施例

考虑:处理器A分配了两个任务。他们分别需要时间 a1 a2 。附近的处理器B(可能是高速缓存反弹的距离)是空闲的。处理器在所有方面都是相同的。我们假设每个任务的代码和内核都在两个处理器的i-cache中(在负载平衡时没有添加页面错误)。

任何类型的上下文切换(包括负载平衡)都需要时间 c。

无负载均衡

完成任务的时间将是 a1 + a2 + c。处理器A将完成所有工作,并在两个任务之间进行一次上下文切换。

工作窃取

假设B窃取 a2,本身会产生上下文切换时间。这项工作将在 max(a1,a2 + c)时间内完成。假设处理器A开始处理 a1; ,当它执行此操作时,处理器B将窃取 a2 并避免处理a1时出现任何中断。 B上的所有开销都是自由循环。

如果 a2 是较短的任务,那么在这种情况下,您已经有效地隐藏了上下文切换的成本;总时间 a1。

工作-耸肩

假设B如上所述完成 a2,,但是A会产生移动它的成本(“耸耸肩”工作)。这种情况下的工作将在 max(a1,a2)+ c 时间内完成;现在,上下文切换总是总时间,而不是隐藏。处理器B的空闲周期浪费了,这里;相反,一个忙碌的处理器A已经把时间耸了耸肩给B。

答案 1 :(得分:5)

我认为这个想法的问题在于它使得实际工作的线程浪费时间不断寻找空闲的处理器。当然有一些方法可以加快速度,比如拥有一个空闲处理器队列,但随后该队列成为并发瓶颈。所以最好不要让线程更好地坐下来寻找工作。

答案 2 :(得分:3)

“偷工作”算法的基本优势是,当每个人都忙时,移动工作的开销会降至0。因此,当一些处理器处于空闲状态时,只有开销,并且开销成本主要由空闲处理器支付,而繁忙的处理器只有非常小的总线同步相关成本。

答案 3 :(得分:2)

据我所知,工作窃取是专为高度并行的系统而设计的,以避免单个位置(单线程或单个内存区域)负责共享工作。为了避免这个瓶颈,我认为它确实会在简单的情况下引入低效率。

如果您的应用程序不是那么平行,以至于单点工作分配导致可伸缩性问题,那么我希望您可以通过明确地按照您的建议进行管理来获得更好的性能。

不知道你可能会谷歌,但我很害怕。

答案 4 :(得分:2)

有些问题......如果一个繁忙的线程忙,你不希望它花时间处理实际工作而不是推测性地寻找空闲线程卸载吗?

你的线程如何决定什么时候有这么多的工作,它应该停止做那项工作来寻找一个有帮助的朋友?

你怎么知道其他线程没有那么多的工作,你将无法找到合适的线程来卸载?

工作窃取看起来更优雅,因为以一种方式解决了同样的问题(争用),这种方式可以保证执行负载平衡的线程只进行负载平衡,否则它们将处于空闲状态。

我的直觉是,从长远来看,你所描述的不仅效率会低得多,而且需要对每个系统进行大量调整才能获得可接受的结果。

虽然在您的编辑中,您建议您要提交处理器来处理此问题,而不是您之前建议的工作线程以及此处的一些注释。如果提交处理器正在搜索最低的队列长度,那么您可能会在提交中增加延迟,这实际上并不是理想的事情。

但更重要的是,这是一种偷工作的补充技术,而非相互排斥的技术。你可能已经减轻了发明工作窃取控制的一些争论,但是在你获得好结果之前你仍然需要调整一些东西,这些调整对于每个系统来说都不一样,而你仍然有可能遇到工作窃取对你有帮助的情况。

我认为您编辑的建议,提交线程正在进行“智能”工作分配,这可能是针对工作窃取的过早优化。您的空闲线程是否会如此困难地撞击总线,以至于您的非空闲线程无法完成任何工作?然后是优化工作窃取的时间。

答案 5 :(得分:0)

因此,与“工作窃取”形成鲜明对比的是,“工作耸肩”的真正含义是,正常的前期工作调度策略,对于处理器,缓存和处理器而言非常聪明。记忆忠诚度和可扩展性。

搜索上述术语/行话的组合会产生许多实质性的后续参考。一些人解决了机器虚拟化的复杂问题,这对提问者来说并不是一个问题,但一般策略仍然相关。