【发布时间】:2015-12-13 04:28:36
【问题描述】:
我在 Tomcat 8 中托管我的 Scala (2.11) WAR,并使用 akka 2.3.+ 和 spray-client 1.3.3。我只将 Akka 用于一个演员,并且在 Tomcat 启动时向它发送一次调用。也可以手动调用。
class RefreshDataActor extends Actor with ActorLogging {
override def receive: Receive = {
case _ =>
implicit val timeout: Timeout = someTimeout
implicit val ec = this.context.dispatcher
val pipeline = sendReceive ~> unmarshal[Data]
pipeline(Get(fileUrl))
.onComplete {
case Success(data) =>
// Do stuff with the data
case Failure(ex) =>
this.log.error("Unable to find the latest version of the data!", ex)
}
}
}
每当有任何调用进入 Tomcat 时,我都会看到它托管的活动线程数量激增。
箭头表示调用服务器的时间。另请注意,CPU 也会缓慢上升,并且在某些时候机器最终会非常努力地工作,似乎什么都没有(屏幕截图中的机器有 8 个内核)。
我通过将 VisualVM 连接到受此影响的一台机器来开始调试该问题。保持活动的线程被命名为default-akka.actor.default-dispatcher-X(其中X 通常是2 到7 之间的任意数字),它们都是WAITING 和default-scheduler-1 (TIMED_WAITING)。 有数百个。还有一个 default-akka.io.pinned-dispatcher-5(可运行)。
我假设这与 Akka 的工作方式有关,但不明白为什么会这样。
【问题讨论】: