- ベストアンサー
止った処理が数時間後動き出したようにみえる現象
- Javaのシステムで画面のボタンを押しても、サーバーから応答が返ってこない現象が発生しました。
- 数時間後になってから、サーバーで返ってこなかった処理が実行されているようなLogが取れました。
- Tomcatを再起動すると正常に動作することが確認されました。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
(12/2 回答4のお礼メールが届く) ……ふーん、でもガーベージコレクトに時間単位の時間なんてかかったっけ? でもそれぐらいしか思いつかないなぁ…… (そして、今) ……って、それじゃなくってこっちだー!!! > 現在弊社のシステムはセッションタイムアウト時間を「無制限」に設定しています。 > ユーザーには、ログアウトせずにブラウザを落とす方がいて、そのために今回発生したのではないかと推測しています。 今回の原因はまさにこれだと思われます。 しかし、それでなぜ時間がかかったのかは > セッション情報などを保存するヒープ領域というものをTomcatが管理しているようです。 > この領域が満杯になるとガベージコレクションという動作が発生し、処理が終わるまでアプリケーションは待ち状態になるようです。 ではないでしょう。 上記の「ログアウトせずにブラウザを落とす」動作によって、サーバーではクライアントとの接続のためのセッションに使用するリソースが使用中のまま保持されます。 自分はこの辺は詳しくないのですが、接続に必要なリソースの量はそんなに多くなかったし、大きくもできなかったはずです。 そのあとタイムアウトになれば例外が発生してリソースが開放されますが、「セッションタイムアウト時間を『無制限』に設定」しているため、そのようなことは起きることなくいつまでもリソースを保持し続けます。 したがって、そのリソースを使い切ったとき、新たにクライアントとの接続を行うことができず、新たな接続要求も無制限に待つため、お互いに延々と相手の処理を待つことになります。サーバーは閉じられたブラウザがセッション終了を求めることを、新たなクライアントは開くことのないリソースが空き接続OKの応答がサーバーから来ることを……。 で、なぜ00:37ごろから処理が再開するようになったかですが……サーバーのOSのほうでリソースを強制開放する何かがあったのかなぁ、としかわかりません。 となると、対処は簡単ですよね。「セッションタイムアウト時間を『無制限』に設定」しているから上記のようなことになるので、ある程度の長さでセッションタイムアウト時間を設定してやればいいと思います。 ……うん、わかってます。タイムアウトが無制限である前提でシステムが組まれていて、どれだけの手直しが発生するかわからない、って。でも、それはやるべきことをやっていなかった結果であり、むしろその結果このようなシステム障害があったという教訓になったと思います。というか、そう思いましょう。上記で解決すれば自分もいい教訓になります。
その他の回答 (3)
- hitomura
- ベストアンサー率48% (325/664)
#1,#2 の回答者ですが、すみません、質問内容を勘違いしていたかもしれません。 いま読み返したら、あなたの質問は要約すると「通常の業務では遅くとも数秒で終わる処理が 11/16 に限って異様に遅くなりました。動作環境は差はないはずなのですが何が原因なのでしょうか?」と読めるのですが、それで間違いないでしょうか。 だとしたら前2回の回答は見当違いなものでした。誤答をお詫びいたします。 さて、上記の要約内容の質問だと仮定すると、いくつか確認したいことがあります。 時間のかかった処理に共通してアクセスしている外部リソースはあるでしょうか? (以下、そのようなリソースがある場合) その外部リソースへのアクセスでタイムアウトの設定はどうなっているでしょうか? 最後に、その外部リソースは問題の処理を行っているとき作動していましたか? 11/16 13:54 ごろは停止していて 11/17 00:37 ごろにアクセス可能になったということはありませんか? というのも、そのような外部リソースへの接続を要求してアクセス可能になるまで延々と待ち続けた結果10時間経過したということが考えられるからです。
- hitomura
- ベストアンサー率48% (325/664)
> LOGに残された処理は、通常行っている処理で、いずれもこれまで1秒以内に終わっています。 > DBの件数も増えていませんので、処理時間が10時間を越えることはありえません。 「ありえません」ですか……では、プロファイラを使って処理時間が10時間以上にはなっていないことを実際に確認しましたか? "tomcat profiler" で検索してみたところ、次のページがヒットしました。このページを参考にどの処理が実際に時間がかかっているのか確認してみてはいかがでしょうか。 http://d.hatena.ne.jp/mallowlabs/20120413/jip
お礼
ご回答ありがとうございました。 プロファイラのことは、これから勉強していきます。
- hitomura
- ベストアンサー率48% (325/664)
> 止った処理が数時間後動き出したようにみえる とのことですが、単に処理に時間がかかっているということはありませんか? 処理時間がデータ件数に応じて指数的に伸びてしまう場合、テスト環境ではデータ件数が少なくて処理時間が一瞬で、実環境で問題が発覚することはよくあることです。
補足
ご回答ありがとうございます。 LOGに残された処理は、通常行っている処理で、いずれもこれまで1秒以内に終わっています。 DBの件数も増えていませんので、処理時間が10時間を越えることはありえません。 よろしくお願いします。
お礼
私の質問にご丁寧にお答えくださりありがとうございます。 原因はまだ解っていませんが、私の推測をお話いたします。 セッション情報などを保存するヒープ領域というものをTomcatが管理しているようです。 この領域が満杯になるとガベージコレクションという動作が発生し、処理が終わるまでアプリケーションは待ち状態になるようです。 セッション情報など保管された情報はセッションがなくなるとクリアされますが、ログインしたまま、ログアウトしないと、そのまま残りヒープ領域が満杯になりやすくなるのではないでしょうか。 現在弊社のシステムはセッションタイムアウト時間を「無制限」に設定しています。 ユーザーには、ログアウトせずにブラウザを落とす方がいて、そのために今回発生したのではないかと推測しています。 私の推測が的外れなものであれば、どうかご指摘ください。 お忙しいところお手数をおかけしますが、よろしくお願い申し上げます。
補足
親身にご回答いただき、ありがとうございます。 >「通常の業務では遅くとも数秒で終わる処理が 11/16 に限って異様に遅くなりました。動作環境は差はないはずなのですが何が原因なのでしょうか?」 質問の仕方が不明確で申し訳ありませんでした。 質問の内容はこのとおりで間違いありません。 外部リソースは、使っておりません。 よろしくお願いします。