Play framework [2.5.0 java] - 阻塞的netty-event-loop线程导致超时

时间:2016-03-21 22:20:49

标签: java playframework akka netty

我们刚刚从Play framework 2.4.3升级到2.5.0(java)。但是,升级后,我们的测试会在几分钟后开始超时。在升级之前,它们运行了一个小时而没有错误。

看起来有些线程被阻止,系统只是停止响应。

我在我的机器上使用Yourkit java profiler在本地运行较小版本的负载测试。最初,有16个netty-event-loop个线程已启动。大约一分钟后,我可以看到他们已经开始阻止:

blocked netty-event-loop threads

当他们阻止时,我开始在负载测试中获得超时。 当我关闭测试时,这些线程似乎恢复了:

recovering netty-event-loop threads

我希望有人可以帮助我们确定导致这种情况的原因。除了升级到Play 2.5所需的更改之外,我们根本没有修改过我们的代码。

以下是我们在application.conf中使用的akka​​线程池配置:

akka {
  fork-join-executor {
    # The parallelism factor is used to determine thread pool size using the
    # following formula: ceil(available processors * factor). Resulting size
    # is then bounded by the parallelism-min and parallelism-max values.
    parallelism-factor = 3.0

    # Min number of threads to cap factor-based parallelism number to
    parallelism-min = 8

    # Max number of threads to cap factor-based parallelism number to
    parallelism-max = 64

    # Setting to "FIFO" to use queue like peeking mode which "poll" or "LIFO" to use stack
    # like peeking mode which "pop".
    task-peeking-mode = "FIFO"
  }
}

剖析器显示有关被阻止线程的以下信息:

Information from the thread monitor

任何人都可以对我们可能做错的事情提供一些见解吗? 谢谢你的帮助。

1 个答案:

答案 0 :(得分:0)

这个问题似乎已经为我们解决了。我们使用Deadbolt-java 2.5.0-SNAPSHOT进行模板和控制器的授权。我们在与Deadbolt相关的日志中看到了一些超时消息。

所以我们从我们的项目中完全删除了Deadbolt,现在负载测试比以前运行得更快。