我们有一个Play 1.2.5应用程序,我们遇到了一些应用程序没有响应的问题。
为应用程序设置了适当的内存设置后问题没有再发生(几天ATM),但我想知道实际原因以及是否有某种方法可以在日志中看到它。
在我们的设置中,我们得到了
这种情况发生在各种调用中,但我有一个使用简单的 renderText -implementation(仅200&“OK”)监视healthcheck的示例。我们经常有这些“时不时”。应用程序在没有启动的情况下返回响应。
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,因此至少请求没有找到它在那里或者日志记录有问题)
首先想到的是线程耗尽。这对我来说似乎不太可能,因为:
play.pool=10
)(也许是相关的,也许不是):有一次我们检查了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连接测试挂起的问题。创建another more focused question并尝试记住在问题解决后也更新此内容。
答案 0 :(得分:0)
原因是与RDS MySQL的TCP连接时不时地变得陈旧 - > c3p0连接pooler管理员线程都被卡住进行连接测试 - >播放请求线程最终等待JPAPlugin.beforeInvocation以获得数据库连接。
查看更集中的问题Connection hanging occasionally with Amazon RDS MySQL & Play Framework 1.2.5 (c3p0 default settings)了解更多细节。