为什么在Akka Streams中添加异步边界会占用大量CPU?

时间:2018-10-19 05:01:54

标签: scala akka akka-stream

我发现我的Akka Streams程序有意外的CPU使用情况。

这是一个简单的例子:

import akka.actor.ActorSystem
import akka.stream.ActorMaterializer
import akka.stream.scaladsl.{Sink, Source}

implicit val system: ActorSystem = ActorSystem.create("QuickStart")
implicit val materializer: ActorMaterializer = ActorMaterializer()

Source.repeat(Unit)
  .to(Sink.ignore)
  .run()

上面的代码段将使源和接收器在同一角色中运行。

它在笔记本电脑上使用大约105%的CPU使用率。按预期工作。

在我添加了异步边界之后:

import akka.actor.ActorSystem
import akka.stream.ActorMaterializer
import akka.stream.scaladsl.{Sink, Source}

implicit val system: ActorSystem = ActorSystem.create("QuickStart")
implicit val materializer: ActorMaterializer = ActorMaterializer()

Source.repeat(Unit)
  .async // <------ async boundary here
  .to(Sink.ignore)
  .run()

此代码段现在将在我的4c8t笔记本电脑上使用大约600%的CPU使用率。

我期望通过添加一个异步边界,该流将在2个单独的actor中运行,并且将花费略高于200%的CPU。但这要花费200%以上。

什么可能导致异步边界使用那么多的CPU?

1 个答案:

答案 0 :(得分:2)

默认akka.actor.default-dispatcher参数是Java的ForkJoinPool。通过调用ThreadPoolConfig.scaledPoolSize对其进行初始化。因此,它默认为起始大小池(处理器数量* 3),最大值为{parallelism-max(64)。