偷工作并行工作似乎并没有偷走太多工作

时间:2018-02-01 16:43:09

标签: java scala parallel-processing work-stealing

我们的想法是在96核计算机上运行并行作业,并且工作正在窃取ForkJoinPool

以下是我目前使用的代码:

import scala.collection.parallel.ForkJoinTaskSupport
import scala.concurrent.forkjoin.ForkJoinPool

val sequence: ParSeq[Item] = getItems().par
sequence.tasksupport = new ForkJoinTaskSupport(new ForkJoinPool())
val results = for {
  item <- sequence
  res   = doSomethingWith(item)
} yield res

此处,sequence包含约20,000件商品。大多数物品需要2-8秒才能处理,其中只有约200件需要更长时间,大约40秒。

问题:

一切运行良好,然而,工作窃取方面似乎不能很好地运作。以下是与实际负载(蓝色)相比的预期总CPU负载(黑色):

Expected vs Actual work loads

在查看CPU活动时,很明显随着工作的进展,越来越少的核心被使用。在过去的10分钟内,只有2或3个核心仍在忙着依次处理数十个项目。

如果使用ForkJoinPool这个应该是偷工作的headers: { Authorization: "Bearer KA.ey**********************************************************************************************************************************" } ,那么仍然在队列中的项目是否会被其他免费核心窃取?

https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ForkJoinPool.html

1 个答案:

答案 0 :(得分:1)

每个工作线程都有自己的内部任务队列,可以防止其他线程的工作窃取,从而限制工作者之间的交互。

这可能解释了您所看到的行为,特别是如果您的项目集中出现的长任务不是随机的。