我发现我的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?
答案 0 :(得分:2)
默认akka.actor.default-dispatcher
参数是Java的ForkJoinPool
。通过调用ThreadPoolConfig.scaledPoolSize
对其进行初始化。因此,它默认为起始大小池(处理器数量* 3),最大值为{parallelism-max
(64)。