无响应的scala-play应用程序

时间:2019-03-08 11:13:59

标签: scala playframework

我正在生产中使用scala-play应用程序。几天前,我发现由于数据库端的CPU过多,play应用开始起作用,响应时间增加了几分钟。 Play应用程序已部署在3个EC2实例上,并且所有实例都已附加到ELB。在这段时间内,两个进程无响应,响应时间长达600分钟(通常响应时间低于200毫秒)。由于其中两个进程的响应时间很高,ELB将其标记为不正常,并且所有请求都路由到单个进程(响应时间为20秒)。查看日志并没有太大帮助。在浏览了几篇文章之后,我了解到线程池中的死锁可能是原因之一。我们已经使用线程池来阻止S3调用和非阻止DB调用。不同的线程池用于这些目的。


    executor {
      sync = {
        fork-join-executor {
          parallelism-factor = 1.0
          parallelism-max = 24
        }
      }

      async = {
        fork-join-executor {
          parallelism-factor = 1.0
          parallelism-max = 24
        }
      }
    }

谁能帮助您理解可能出了什么问题? 所有3个节点都部署了相同的内部版本,但是只有两个节点没有响应。这些无响应节点上的CPU不到10%。

播放:2.5.14 Scala:2.11.11

1 个答案:

答案 0 :(得分:1)

有很多事情可能出错,这只是您提供的信息的猜谜游戏。

我将从创建无响应的JVM线程转储开始。如果您确实捕获了应用程序的控制台日志,则获取转储的一种方法是将信号3发送到jvm进程。

假设您在Unix环境中运行服务,

ps aux | grep java 

找到运行您的Play应用的Java pid。

kill -3 <pid>

通过发送信号3,jvm在控制台中产生线程转储。

如果控制台不可用,请执行

jstack -l <pid> >> threaddumps.log

现在,您将能够查看线程的快照状态以及在存在阻塞线程的情况下阻塞的位置。