【发布时间】:2018-10-19 05:01:54
【问题描述】:
我发现我的 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()
上面的代码片段将让 source 和 sink 在同一个 actor 中运行。
它在我的笔记本电脑上使用了大约 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 个单独的参与者中运行,并且将花费 200% 以上的 CPU。但它的成本远远超过 200%。
什么可能导致异步边界使用这么多 CPU?
【问题讨论】:
-
你可以尝试分析来找出(或者只是在shell上使用
jstack <pid>。最可能的情况是你的线程池太大了。尝试设置akka.actor.default-dispatcher.fork-join-executor.parallelism-factor = 1。
标签: scala akka akka-stream