【问题标题】:Lots of Akka Threads in TomcatTomcat 中有很多 Akka 线程
【发布时间】: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 的工作方式有关,但不明白为什么会这样。

【问题讨论】:

    标签: scala tomcat akka spray


    【解决方案1】:

    发现问题。我不止一次调用ActorSystem(),它创建了一个新的actor系统,而不是重用已经创建的系统。这导致越来越多的系统被创建,并且由于某种原因没有被删除。

    【讨论】:

    • Actor 系统在您明确终止之前不会死亡。
    猜你喜欢
    • 1970-01-01
    • 2020-03-06
    • 2016-04-05
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    • 2013-03-11
    • 2011-02-20
    相关资源
    最近更新 更多