Play 1.2.5 アプリケーションを入手しましたが、アプリケーションが応答しなくなるという問題がいくつかありました。
アプリケーションに適切なメモリ設定を設定した後、問題は再発していません (数日間の ATM) が、実際の理由と、ログでそれを確認する方法があるかどうかを知りたいです。
私たちのセットアップでは、
- AWS で実行されている Play 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 は 300 秒 = 5m のプロキシ タイムアウト長)
再生ログには何もありません (コントローラーでリクエスト URL のログを取得したため、少なくともリクエストがそこまで到達していないか、ログに問題がありました)
最初に考えられるのは、スレッドが不足していることです。次の理由から、これは私にはほとんどありそうにないようです。
- 開発中 -> トラフィックがかなり少ない
- これは、ログに数時間前のトラフィックがない場合にも発生します。
- 10 個のスレッドを取得しました (
play.pool=10
) - 非同期の WS 呼び出しは使用していません (Play 1.2.X では多少バグがあるようです)。
- 通話が長時間ブロックされない
- さまざまな使用後のランダムなテストでは、スレッドがハングしていないようです (jstack で調べたところ、すべてが ~OK のようです)。
(関連しているかもしれませんが、関連していないかもしれません): ある時、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 年 3 月 1 日の金曜日)、この問題は発生していません。
jvm.memory=-Xms64m -Xmx512m -XX:PermSize=64m -XX:MaxPermSize=256m
ただし、ログに記録されたメモリの問題はありませんでした。本当の理由についての手がかりがないので、私はまだ少し心配しています:
- 何が原因でしょうか
- いくつかのメモリの問題です。ログに見つからないのはなぜですか?
- スレッドを長時間ブロックしたままにする (非決定論的な) もの
- これが再び発生した場合、ログで原因を確認する方法はありますか?
- ログでメモリの問題を取得するために必要な設定はありますか?
更新 : おそらく MySQL 接続テストのハングに問題があるようです。別のより焦点を絞った質問を作成し、問題が解決した後もこれを更新することを忘れないようにします。