- - PR -
ApacheとTomcat連携時のプロセスについて
1
| 投稿者 | 投稿内容 | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2003-07-07 14:46
こんにちは。
Tomcat4.xとApache2.xとの連携を mod_jkを使用してシステムを構築しております。 その際に、Tomcat起動中にpsコマンドで確認すると 処理を終了したJavaのプロセスがそのまま残り、 数が増え続けてメモリを食い潰してしまう現象に陥っています。 以下の環境で構築しています。 ・Turbo Linux 6.1 ・j2sdk1.4.2 ・apache2.0.46 ・tomcat4.1.24 ・mod_jk 2.0.43 TomcatやApacheなどのログを確認しても エラーを示す内容もありませんでした。 現在は、以下の単純なコードで調査を進めていますが 同様の現象に陥っています。 なにか、解決のヒントになるようなものを ご存じの方、是非教えて頂けないでしょうか。 ##################################### import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class sleep2 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { try{ response.setHeader("Connection", "close"); PrintWriter out = response.getWriter(); out.println("<html>"); out.println("<head>"); out.println("<title>TEST END</title>"); out.println("<body>"); out.println("TEST END"); out.println("</body></html>"); out.flush(); out.close(); out = null; }catch(Exception ex) { ex.printStackTrace(); } } } ########################### | ||||||||||||
|
投稿日時: 2003-07-07 16:13
ここの意味するところがいまいち見えません。 処理を終了というのはHTTPのリクエストに対するレスポンスが返ったあと ということでしょうか? また、数が増え続けるてメモリを食いつぶすというのはプロセスの数が 上限なく増えていってOS側のメモリが足らなくなるということでしょうか? | ||||||||||||
|
投稿日時: 2003-07-07 17:41
まりりさん、返信ありがとうございます。
処理が終了というのはHTTPレスポンスを返した後のことです。 また、メモリを食い潰すというのは、プロセスの数が増え続け、 psコマンドで見たときに、HTTPレスポンスを返しているのに /usr/java/j2sdk1.4.1_03/bin/java -server -Xmx128M -Xms64.... のプロセスがそのまま残り増え続けてしまうということです。 よろしくお願いいたします。 | ||||||||||||
|
投稿日時: 2003-07-07 19:09
サーブレットはマルチスレッドで動作しますので、
瞬間的にアクセスがあった場合は、スレッドが残っている状態が しばらく続くのが普通だと思います。 あまり詳しくないのですが、おそらく残ったスレッドはプールに 貯蔵されて次のアクセスが来た場合、使いまわされるようになっているはずです。 (設定されたプロセス数の最大値を超えたら問題ありですけど。) アクセス数が少ないのに CPUの負荷が100%になったり、プロセス数がどんどん増えていったりという 経験が何度かあります。(しかも運用中に^^;) その場合、大抵プログラムのミスor環境設定のミスが原因でした。 例えば、 o ある文字が来た場合のみ無限ループするようになっていた。(普段は表に出てませんでした。) o 名前解決がうまくいかなくなっていて、JavaMailでメールが送れずプロセスがどんどんたまっていった。 などです。 | ||||||||||||
|
投稿日時: 2003-07-08 02:24
おっきーさんがおっしゃっているようにServletは1プロセスで複数の処理を行います。
ですので、レスポンスが返ったからといってプロセスが消えるとは限りません。 (ここが典型的なCGIとの大きな違いです) 単にプロセスが残り続けることで不思議に思っていたのでしたら正常だと思います。 ただこれだと「メモリを食いつぶす」という表現には遠い気がします。 他にも何か現象が起きてます? | ||||||||||||
|
投稿日時: 2003-07-08 10:28
返信ありがとうございます。
皆様のご指摘通り、瞬間的にアクセス数を増加させると、 Tomcatのserver.xmlで設定しているmaxProccessorの値より やや多い数のスレッドが生成され、レスポンスを返した後も スレッドがそのまま残り続けます。(Tomcat終了時まで) 各スレッドが使用し続けるメモリ量が、 この投稿に示したサンプルでも43Mとなるため、 生成するスレッド数を多くしすぎると空きメモリを0となってしまいます。 その状態でアクセスされると 「Internal Server Error 500」 が表示され、Tomcatのログに 「No processor available, rejecting this connection」 が残りました。 当初、プログラムミスを疑ったのですが、サンプルでも同様の結果と なるため、環境設定の調べつつも、 負荷テストの結果、生成されるスレッド数は maxProccessorの値を大きく超える事はなさそうなので、 この値をうまく調整する事で対応できるのでは?と 思っております。 | ||||||||||||
|
投稿日時: 2003-07-08 10:48
unibon です。こんにちわ。
#あまりよくは知らないのですが。
私は Linux の知識はほとんどないのですが、 ps コマンドでプロセスとして見えるのは、実態はスレッドだと思いますが、 それで合っているでしょうか (実態も「プロセス」と呼ぶほうが正しいのかもしれませんが)。 とにかく、すなわち Java VM のプロセスがいくつも立ち上がるわけではないのですよね。
クラス名が sleep2 なのが気になるのですが、 提示されたコード以外で、なにか sleep に類する処理をされているのでしょうか。 また、Tomcat に付属するサンプルのままでもその現象が起きるのでしょうか。 あと、あまり関係ないかもしれませんが、
あたりのコードは取っ払っても良いと思うのですが、どうでしょうか。 | ||||||||||||
1
