- PR -

Tomcatが固まってしまう

1
投稿者投稿内容
未記入
常連さん
会議室デビュー日: 2004/06/03
投稿数: 30
投稿日時: 2007-06-19 22:53
現在Tomcat+Apacheでシステムを開発していますが、時々Tomcatの調子が悪くなります。
(表示させたい画面が固まってしまう)

まったく画面が表示されない場合もありますし、途中まで表示される場合もあります。


Tomcat側のログの一部抜粋は以下の通りです。
このログが出力されて30分後ぐらいに調子が悪くなることがあります。
(※毎回ではないですし、数日普通に動作することもあります)

-------------------------------------------------------------------------------------------
2007/99/99 14:14:52 org.apache.jk.core.MsgContext action
警告: Error sending end packet
java.net.SocketException: パイプが切断されました。
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
at org.apache.jk.common.ChannelSocket.send(ChannelSocket.java:518)
at org.apache.jk.common.JkInputStream.endMessage(JkInputStream.java:112)
at org.apache.jk.core.MsgContext.action(MsgContext.java:293)
at org.apache.coyote.Response.action(Response.java:182)
at org.apache.coyote.Response.finish(Response.java:304)
at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:204)
at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:282)
at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:754)
at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:684)
at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:876)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:534)
2007/99/99 14:14:52 org.apache.jk.common.ChannelSocket processConnection
警告: processCallbacks status 2
-------------------------------------------------------------------------------------------


また、スレッドのダンプも取得はしてみたのですが、見方がよくわかりません。
(以下、ダンプ抜粋)
-------------------------------------------------------------------------------------------
"TP-Processor3" daemon prio=5 tid=0x000f6820 nid=0x29 in Object.wait() [d2701000..d27019c8]
at java.lang.Object.wait(Native Method)
- waiting on <0xd9cb1618> (a org.apache.tomcat.util.threads.ThreadPool$ControlRunnable)
at java.lang.Object.wait(Object.java:429)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:656)
- locked <0xd9cb1618> (a org.apache.tomcat.util.threads.ThreadPool$ControlRunnable)
at java.lang.Thread.run(Thread.java:534)


"main" prio=5 tid=0x00037348 nid=0x1 runnable [ffbed000..ffbeeb34]
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:353)
- locked <0xd9cb1ab0> (a java.net.PlainSocketImpl)
at java.net.ServerSocket.implAccept(ServerSocket.java:448)
at java.net.ServerSocket.accept(ServerSocket.java:419)
at org.apache.catalina.core.StandardServer.await(StandardServer.java:388)
at org.apache.catalina.startup.Catalina.await(Catalina.java:615)
at org.apache.catalina.startup.Catalina.start(Catalina.java:575)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:275)
at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
-------------------------------------------------------------------------------------------

「waiting」「locked」など、気になるキーワードはあるのですが、それがどこを指すのかが
わかりません。
(エラー箇所にオリジナルのプログラムがないため)

各ログを見るポイントをご教授願いたいと思います。


またTomcatが自動的に再起動するのはどういった場合でしょうか?
(現在は、自動的に再起動していない)

バラバラと質問を書いてしまいましたが、よろしくお願いいたします。

-------------------------------------------------
Tomcat5.5.16
JDK1.4
Apache1.3
OS:Solaris8
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2007-06-20 10:14
>2007/99/99 14:14:52 org.apache.jk.core.MsgContext action
>警告: Error sending end packet
>java.net.SocketException: パイプが切断されました。
>at java.net.SocketOutputStream.socketWrite0(Native Method)
>at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
java.net.SocketOutputStream.socketWrite0() というのはソケットに対してなんらかのデータを書き込むメソッドです。
この途中で「パイプが切断」というのはソケットがクローズされたことを意味します。
つまり、レスポンスをクライアント(ブラウザ)に送信している途中にブラウザを閉じるなどして送信ができなくなったことを意味します。
大きなファイルをダウンロードしている途中でブラウザを終了させれば再現できると思います。
ネットワーク障害があると頻発するかもしれません。

---------------
"TP-Processor3" daemon prio=5 tid=0x000f6820 nid=0x29 in Object.wait() [d2701000..d27019c8]
at java.lang.Object.wait(Native Method)
- waiting on <0xd9cb1618> (a org.apache.tomcat.util.threads.ThreadPool$ControlRunnable)
at java.lang.Object.wait(Object.java:429)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:656)
---------------
スレッドプールで仕事を与えられずに待機している状態で、無害です。
普通に起動して何もしていない状態であればこういったスレッドが多く見られると思います。

---------------
"main" prio=5 tid=0x00037348 nid=0x1 runnable [ffbed000..ffbeeb34]
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:353)
- locked <0xd9cb1ab0> (a java.net.PlainSocketImpl)
at java.net.ServerSocket.implAccept(ServerSocket.java:448)
at java.net.ServerSocket.accept(ServerSocket.java:419)
at org.apache.catalina.core.StandardServer.await(StandardServer.java:388)
---------------
ServerSocket はクライアントからの接続を受ける口みたいなものです。
accept() メソッドを呼ぶと実際に接続があるまで待ち続け、接続があると Socket のインスタンスを返します。
この場合、accept() メソッドの延長上で、クライアントからの接続を待っている状態で、無害です。
やはり、普通に起動して何もしていない状態であればこの状態のスレッドが見られるはずです。

まず、固まっているときに Tomcat に対して接続ができるのかどうかを確認しましょう。
telnet コマンドで確認できます。
$ telnet ホスト名 ポート番号

Connection refused となれば、接続が出来ない状態です。
-----------
Trying 127.0.0.1...
telnet: connect to address 127.0.0.1: Connection refused
telnet: Unable to connect to remote host
-----------
ネットワークに何か障害が起きていないか。また Tomcat が正常にリスンしているか確認しましょう。
リスンしているかどうかは netstat -an で確認できます。

[ メッセージ編集済み 編集者: インギ 編集日時 2007-06-20 10:21 ]
未記入
常連さん
会議室デビュー日: 2004/06/03
投稿数: 30
投稿日時: 2007-06-20 17:24
回答、ありがとうございます。参考になりました。
(エラーの整理ができました)

> まず、固まっているときに Tomcat に対して接続ができるのかどうかを
> 確認しましょう。
> telnet コマンドで確認できます。
> $ telnet ホスト名 ポート番号
固まってしまっている際は、返ってきません。

現在、TomcatとApacheはそれぞれ別のサーバに入っています。
コネクタとして「mod_jk」を利用しています。

また、TomcatとApacheが入っているそれぞれのサーバ間に
負荷分散装置があります。

「mod_jk」のインストール方法がよくない可能性はありますかね?
1年前にインストールしたもので、インストール方法を覚えていない
もので。

「mod_jk」のインストール方法をご存知の方がいらっしゃれば
ご教授していただきたいと思います。

よろしくお願いいたします。

-------------------------------------------------
Tomcat5.5.16
JDK1.4
Apache1.3
OS:Solaris8
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2007-06-21 11:02
個人的には mod_jk やApache/Tomcat よりもネットワーク周りを疑った方が良いと思います。
mod_jk のインストール方法であればここらへんに書いてあります。
1

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