- PR -

Servletで応答が帰ってこなくなった

投稿者投稿内容
橋本
会議室デビュー日: 2004/03/16
投稿数: 6
投稿日時: 2004-03-16 11:45
はじめて投稿させていただきます。橋本と申します。

Redhat Linux 8.0(Kernel 2.4.18-14)
Apache 2.0.44
Tomcat 4.1.18
j2sdk 1_4_1_01

現在、上記環境でServletで作成したWEBアプリを運用しているのですが、
突然、Submitボタンを押下しても応答が帰ってこない現象が発生してしまいました。
そのときはApacheもTomcatもプロセスはあがっていたのですが、結局はApacheと
Tomcatを再起動することでしか解消できませんでした。
(再起動前にスレッドダンプを取っていれば良かったのですが、復旧を優先して
しまったため取っていません。すごく後悔しています。)

この現象が起きたとき、静的HTMLページは表示できていたようですので、Tomcat側で
何か問題があったのではないかと考えています。
また、アクセスも少ない時間帯に起こりましたので、負荷が原因というのも考えにくいです。

ネットで調査してみたところ、JDK1.4.1_01にはバグが多いという情報がありましたので
顧客にJDKのバージョンアップを提案したのですが、今回の現象に直結したバグ情報を
提示することが出来ずに却下されてしまいました・・・
そこで、現在はBug Paradeを検索して情報収集しています。
(なにぶん英語が弱いため進みが遅いですが・・・)

テストサーバで再現テストを行ったのですが再現されず・・・
再現パターンも分からない状態です。

もし、このような現象について何か情報がありましたら、どんな些細なことでも
結構ですので教えて頂けませんでしょうか?

どうぞよろしくお願い致します。
でゅうく
大ベテラン
会議室デビュー日: 2003/11/30
投稿数: 129
投稿日時: 2004-03-16 17:32
情報という訳ではないのですが・・。

Apache - Tomcat のコネクタはどうなんでしょうね?
橋本
会議室デビュー日: 2004/03/16
投稿数: 6
投稿日時: 2004-03-16 20:57
でゅうくさん、返答ありがとうございます。

> Apache - Tomcat のコネクタはどうなんでしょうね?

ご指摘ありがとうございます。
Apache - Tomcat のコネクタはmod_jk2を使用しております。
問題発生時のコネクタのログでは特にエラーは出ておりませんでした。


前回の投稿だとJDKの情報だけをお願いしているような書き方でしたが、
JDK以外(Tomcat, mod_jk2等)でも何か情報がありましたらぜひ教えてください!
また、こういう情報があった方が良い、このログは見たか?等がありましたらご指摘ください。

よろしくお願いします。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-03-16 23:05
このテのケースはやはりスレッドダンプがないとなんとも言えないですね・・・。
いずれにせよ JDK は常に最新のバージョンを使うのが良いと思います。JDK のリグレッションバグって結構すくないですから。

また、JDK1.4.1 は既に EOL なので JDK1.4.2 にアップグレードするのが無難です
# Sun とサポート契約は結んでいないのでしょうか?

余計なお世話ですが RH8.0 もサポート終了してますよね・・。

[ メッセージ編集済み 編集者: インギ 編集日時 2004-03-16 23:05 ]
ayum
常連さん
会議室デビュー日: 2002/03/28
投稿数: 44
お住まい・勤務地: 東京
投稿日時: 2004-03-17 08:50
単純にDBでデッドロックが発生していたり
ロジックのどこかで無限ループになってしまっていたりというような
プログラム上のミスでもこのような現象は出てきます。
ので、VMのエラーを疑う前に
手元のプログラムをもう一度チェックされてみてはいかがでしょうか。

#私自身VMエラーを疑っておいて、実はそのVMエラーを引き起こしているのは
#自分のロジックのミスにより発生した無限ループだった、ということもありました。

切り分けとして、
DBを使っているなら応答がない状態のときに
デッドロックや長時間の待機が発生していないか、
AppサーバのCPU使用率が極端に上がっていないか、
あるユーザーで応答が返ってこなくなったとき
別のユーザー(クライアント)で応答は返ってくるか、等、
その辺りに注目してみると原因を探す手がかりになるかもしれません。
橋本
会議室デビュー日: 2004/03/16
投稿数: 6
投稿日時: 2004-03-17 09:41
インギさん、ayumさんありがとうございます。

>インギさん
やはりスレッドダンプですよね、もっと早く気づいていれば・・・
本当に悔やまれます。

JDKのバージョンアップは交渉中です。なんとか最新版にあげておきたいところですので。
RH8.0の件は落ち着いたら検討してみます。ご指摘ありがとうございます。

>ayumさん
はい、私もまず初めにプログラムを疑いました。
でも同じDBを使用している他のAppサーバ(アプリは同じ)では問題なく動いていましたし、
問題のAppサーバに接続していた5ユーザほどにトレースしたところ、皆同じ現象だったため
DBサーバやプログラムとは違うのかなと思いました。
(そのユーザはそれぞれ違う処理を行っていました)
CPUの使用率も通常通りで異常な点は見られませんでした。

ただ、ご指摘の通りもう一度プログラムも調査してみます。

今まで1ヶ月以上も何も変更を加えないで稼働してきたのに急にこうなってしまって、
さらに復旧後は現在に至るまで普通に稼働しています・・・
あのとき何が起きていたのでしょう・・・
やはりスレッドダンプ・・・障害時はとても重要ですね。
橋本
会議室デビュー日: 2004/03/16
投稿数: 6
投稿日時: 2004-04-27 10:08
すいません、ずいぶん返答が遅れてしまいました。
その後のご報告です。

早期発見の対策として、5分に1回、WEBページの応答が帰ってくるかの
チェックするシェルを実行するようにしました。
(1分以上応答がなかったらメールを送信し、スレッドダンプを出力する)

そしたらメールが飛んできました!それも何度も・・・

調査してみたところ、1分以上応答が帰ってこない現象が2日に1度は
発生していたようです。(多いときは1日に2度も)
大体は1〜2分ほどで解消されるため問題になっていなかったようですが、
それを把握していなかったのが怖いところです・・・

出力されたスレッドダンプを確認すると、以下の部分が頻繁に出ていました。
(省略させて頂いてます)

"Thread-11" daemon prio=1 tid=0x0x8158e70 nid=0x49f waiting for monitor entry [6c800000..6c801830]
at java.sql.DriverManager.registerDriver(DriverManager.java:259)
- waiting to lock <0x64b83a60> (a java.lang.Class)

これを見ると、どうもDBドライバのロードで止まっているように見えます。

この結果から、やはりJDKのバグの可能性が高いと感じましたので、
JDK1.4.1_01からJDK1.4.1_07にバージョンアップしました。
(JDK1.4.2_XXはちょっと問題があってできませんでした)

現在はバージョンアップをして1ヶ月近く経ちます。
以前は頻繁に起きていた1分以上の無応答が、バージョンアップ後は
まだ一度も発生しておりません。
バージョンアップが効果有ったのだと思いたいですね。

以上。
アドバイス頂いた皆様、ありがとうございました。
みずは
会議室デビュー日: 2003/07/21
投稿数: 4
投稿日時: 2004-04-28 14:10
まずは、解決おめでとうございます。

私も、最近同様の現象に悩まされております。
こちらはまだ解決しておりません。

便乗で申し訳ありませんが、何かヒントにならないかと思い投稿させて頂きました。

引用:

橋本さんの書き込み (2004-04-27 10:08) より:

出力されたスレッドダンプを確認すると、以下の部分が頻繁に出ていました。
(省略させて頂いてます)

"Thread-11" daemon prio=1 tid=0x0x8158e70 nid=0x49f waiting for monitor entry [6c800000..6c801830]
at java.sql.DriverManager.registerDriver(DriverManager.java:259)
- waiting to lock <0x64b83a60> (a java.lang.Class)

これを見ると、どうもDBドライバのロードで止まっているように見えます。




これなんですが、他のスレッドで
"Thread-40" daemon prio=5 tid=0x2c3f68 nid=0x3a waiting for monitor entry [e0e7f000..e0e81994]
.
.
at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:314)
at java.sql.DriverManager.getConnection(DriverManager.java:512)
- locked <f67971b0> (a java.lang.Class)
at java.sql.DriverManager.getConnection(DriverManager.java:171)
- locked <f67971b0> (a java.lang.Class)
.
.

となっている箇所はありませんか?

私は、lockがかかるのはこっちが先だと思っています。
それで、その後 registerDriver の登録も出来なくなるような気がしています。

環境は、apache1.3.27,tomcat4.1.24,mod_jk2,oracle と若干違っていますが...。
VMの環境を1.4.1_07に変えてもまた発生してしまいました。

スキルアップ/キャリアアップ(JOB@IT)