1

我们有一个 Play 1.2.5 应用程序,但我们遇到了一些问题,即应用程序变得无响应。

在为应用程序设置正确的内存设置后,问题没有再次发生(几天 ATM),但我想了解实际原因以及是否有某种方法可以在日志中查看它。

在我们的设置中,我们得到了

  • 播放在 AWS 上运行的 1.2.5 应用程序 (Ubuntu 12.04)
  • MySQL RDS 数据库
  • Apache 服务器充当代理(处理 SSL 等)。

各种调用都发生了这种情况,但我有一个使用简单的renderText实现(仅 200 和“OK”)监控运行状况检查的示例。我们“时不时地”有这些。应用程序在未启动的情况下返回响应。

Apache 访问日志有:

  (IP addr) - - [01/Mar/2013:09:31:16 +0200] "GET /monitor/healthcheck HTTP/1.1" 502 4305 "-" "NING/1.0"

Apache 错误日志有:

  [Fri Mar 01 09:36:16 2013] [error] [client (IP addr)] (70007)The timeout specified has expired: proxy: error reading status line from remote server localhost:8080
  [Fri Mar 01 09:36:16 2013] [error] [client (IP addr)] proxy: Error reading from remote server returned by /monitor/healthcheck

(Apache 有 300s=5m 代理超时长度)

播放日志那里没有任何内容(我们在控制器上获得了请求 URL 日志记录,因此至少请求还没有找到它的方式或者日志记录有问题)

第一个想法是线程用完了。这对我来说似乎不太可能,因为:

  • 我们正在开发中 -> 流量非常低
    • 这也发生在日志在几个小时内没有以前的流量的情况下
  • 我们有 10 个线程 ( play.pool=10)
  • 我们没有使用异步 WS 调用(Play 1.2.X 似乎有些错误)
  • 长时间无通话阻塞
  • 在各种使用后进行随机测试,似乎没有线程挂起(用 jstack 检查一切似乎都很好)

(也许相关,也许不相关):有一次我们检查了 jstack,所以它没有响应 cacll:

$ jstack 7842
7842: Unable to open socket file: target process not responding or HotSpot VM not loaded
The -F option can be used when the target process is not responding

但是,在尝试 -F 之前,我们再次尝试并得到了正确的响应,因此如果 JVM 处于某种无响应状态,它很快就会恢复正常。

在一些帮助下,我们设置了正确的内存设置,从那以后(上周五 2013-03-01)我们没有遇到这个问题。

jvm.memory=-Xms64m -Xmx512m -XX:PermSize=64m -XX:MaxPermSize=256m

但是,我们没有在日志中打印任何内存问题。我仍然有点担心,因为我不知道实际原因,所以:

  • 可能是什么原因
    • 一些内存问题,为什么在日志中找不到?
    • 一些(不确定的)事情会使线程长时间阻塞
  • 如果再次发生这种情况,是否有某种方法可以在日志中查看原因?
    • 需要一些设置来获取日志中的内存问题?

更新:似乎可能是 MySQL 连接测试挂起的问题。创建了另一个更集中的问题,并会在问题解决后尝试记住更新此问题。

4

1 回答 1

0

原因是与 RDS MySQL 的 TCP 连接时不时地过时 -> c3p0 连接池管理线程都卡在进行连接测试 -> 播放请求线程最终在 JPAPlugin.beforeInvocation 处等待以获取数据库连接。

有关更多详细信息,请参阅Amazon RDS MySQL & Play Framework 1.2.5(c3p0 默认设置)偶尔挂起的更集中的问题。

于 2013-05-27T10:31:44.227 回答