
Javaのシステムを運用しています。
1台のサーバー(CentOS5.0)に、Apache-Tomcat5.0-PostgreSQL8.1-アプリケーション(顧客ごと(10社))がインストールされています。
アプリケーションの切り分けはTomcatのconf/catalina/localhost/コンテキスト.xml で定義しています。(コンテキスト1~10を作成)
昨年秋から以下の障害が発生していますが、未だに原因がわからない状況です。
Javaの知識、Tomcatの知識、PostgreSQLの知識など乏しく、ログも取れていない状況です。
どうか、疑わしい原因、調査方法など教えていただきたく存じます。
障害状況
日付 現象 回復
11/6 A画面でB画面への遷移ボタンをした時に Tomcat再起動し、再実行したところ
サーバーのB画面作成処理が中断 正常に処理できた。
11/16 TOPメニューからC画面を選択したが、 約10時間後、中断していたC画面処理
サーバーのC画面作成処理が中断 が再開された。その後正常に処理。
12/26 D画面でE画面への遷移ボタンをした時に Tomcat再起動し、再実行したところ
サーバーのE画面作成処理が中断 正常に処理できた。
1/6 F画面でG画面への遷移ボタンをした時に Tomcat再起動し、再実行したところ
サーバーのG画面作成処理が中断 正常に処理できた。
1/8 F画面でH画面への遷移ボタンをした時に 約45分後、中断していたH画面処理
サーバーのH画面作成処理が中断 が再開された。その後正常に処理。
・他のユーザーがその顧客のシステムを
使うと、E画面処理、G画面処理、H画面
処理で中断する。
・他の顧客のシステムは、同じ処理を行
っても正常に処理できる。(レスポンス
も正常)
中断した処理では、データベースのアクセスは読込み(SELECT文)のみです。
プログラムではThreadクラスは使っていません。
Tomcatの設定でセッションタイムアウト時間を無制限(-1)に設定していました。
Tomcatの設定でコネクションプールの最大値は100に設定しています。
障害発生時は、ログインユーザーは一人だけでした。
その後、GCログの出力、ヒープメモリ使用状況のログ出力、PostgreSqlのログ出力の設定を行いました。
また、セッションタイムアウト時間を30分に設定しました。
本日(1/29)まで障害は発生しておりません。
よろしくご教授ください。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
単純な発想として、コネクションの閉じ忘れとかは無いですか?
コネクションの管理を、自前でやっているのか、フレームワークを利用しているのかで違ってくると思いますので、もしかしたら関係ないかもしれませんが…。
(私も、開発中に時々やってしまいます。まったく反応がなくなり、なんでだ?となり、調べてみると閉じ忘れていた。)
障害発生時のコネクション数を確認してみてはどうでしょうか?
あるいは、障害が発生していなくても、コネクション数が予想より多くないかとか。
ただ、起動時にいきなり最大数を確保してしまうようになっていると、見分けがつかないかもしれません。
コネクションを閉じ忘れていても、Tomcatを再起動すれば、コネクションが一旦解放されます。(同時に、ロックも解放されると思います。)
ご回答ありがとうございます。
私も最初にコネクションのClose漏れを疑いました。
テスト環境にて、コネクションプールを1個ににてテストしましたが、Close漏れはありませんでした。
以前、Close漏れがあったときは、
SQLNestedException: Cannot get a connection, pool exhausted
が発生しエラーログが出ました。
今回はエラーログは何も出ません。
PostgreSQLからの応答をずっと待っているように見えます。
よろしくお願いします。
No.2
- 回答日時:
同時にPostgreSQL8.1を使ったユーザーは居ない、ということで予想は外れてます。
もしも使ったユーザーがいれば、ツールの使用等によりロック処理をしていれば、
10時間後にロック解除することで11/16日のように処理が進むかなと予想しました。
システムが発行するクエリにロックを掛けるようなものはないのでしょうか?
この回答への補足
ご回答をいただきましてありがとうございます。
現象から見ると、DBの特定のテーブルにロックがかかっていて、ロックが解除されるまで待っているように見えます。
調べましたところ、PostgreSQLはSELECT文でもロックがかかるそうです。
現象が発生した処理では、SELECT文だけです。しかも、データ量も少なく、1秒もかからない処理です。
利用ユーザーは1人でデッドロックがかかることは考えにくいのです。
他に、ロックが解除されない状況というものが発生することがあるのでしょうか。
よろしくご教授ください。
teketonさん、ご回答ありがとうございます。
システムが発行するクエリにロックを掛けるようなものはありません。
システム以外では、毎夜、1:02から、バックアップ取得、バキューム、リインデックス処理を行っていますが、同じ時刻には障害は発生していません。
PostgreSQLはSELECT文だけでもロックがかかるという記事を見つけました。
http://d.hatena.ne.jp/chiheisen/20100310/1268238 …
この現象の原因になりうるでしょうか。
また、ロックが原因と仮定したとき、Tomcatの再起動でロックが解除されるものでしょうか。
お考えをお聞かせください。
よろしくお願いします。
No.1
- 回答日時:
DBにロックがかかったのでは?
該当時間帯にDBを使用していたユーザはTomcatからのみでしょうか。
DBを直接参照していたり、バッチが動いていたりとか。
この回答への補足
ご回答ありがとうございます。
障害発生時の状況は、DBのロックがかった状態と思えますが、
Tomcatを再起動することでロックが解除できるのでしょうか。
また、放置した状態で、10時間後、ロックが解除されることがあるのでしょうか。
teketonさんのお考えをお聞かせください。
よろしくお願いします。
ご回答ありがとうございます。
該当時間帯にDBを使用していたユーザーは、Tomcatからのみです。
バッチ処理は行っていません。
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Java-jspの画面入力値保持について
-
ServletからServletへの値渡し
-
C言語で今まで表示していた画面...
-
モーダル画面の親をクリック時...
-
セッション切れでのリクエスト...
-
三菱GOTの画面切り替えについて
-
C# ログイン画面からメイン画面...
-
非アクティブな画面を操作する...
-
JAVAのセッション変数の上書き...
-
javaのstrutsを使った画面遷移...
-
検索画面→結果画面→検索画面と...
-
登録後、呼び出し元ページに戻...
-
window.open()使用サブウィンド...
-
location.hrefでページ切替時の...
-
呼び出したフォームが最前面に...
-
JDBCにてデータをひく際のエラ...
-
Sessionがnullになりません。
-
Strutsのデータ受け渡しについて
-
子画面から孫画面をポップアッ...
-
MFCプログラミング
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Java-jspの画面入力値保持について
-
三菱GOTの画面切り替えについて
-
ServletからServletへの値渡し
-
セッション切れでのリクエスト...
-
C言語で今まで表示していた画面...
-
ServletからHTMLページへの遷移...
-
java初心者です。 画面Aで情報...
-
Javaプログラミングの質問にな...
-
登録後、呼び出し元ページに戻...
-
system("cls")について
-
【swing】ボタンクリックにより...
-
コンボボックスの値が画面移動...
-
遷移元を判定したい!
-
C# ログイン画面からメイン画面...
-
peek()の機能が使えれば・・・
-
ASP.NET 画面遷移前の状態を保...
-
Sessionがnullになりません。
-
ブラウザアドレスバーからのURL...
-
画面を隠す・消す方法を教えて...
-
検索画面→結果画面→検索画面と...
おすすめ情報