- PR -

ApacheとTomcat連携時のプロセスについて

1
投稿者投稿内容
shinmai
会議室デビュー日: 2003/03/12
投稿数: 5
投稿日時: 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();
}
}
}
###########################

まりり
ぬし
会議室デビュー日: 2001/12/05
投稿数: 329
投稿日時: 2003-07-07 16:13
引用:

その際に、Tomcat起動中にpsコマンドで確認すると
処理を終了したJavaのプロセスがそのまま残り、
数が増え続けてメモリを食い潰してしまう現象に陥っています。


ここの意味するところがいまいち見えません。

処理を終了というのはHTTPのリクエストに対するレスポンスが返ったあと
ということでしょうか?

また、数が増え続けるてメモリを食いつぶすというのはプロセスの数が
上限なく増えていってOS側のメモリが足らなくなるということでしょうか?
shinmai
会議室デビュー日: 2003/03/12
投稿数: 5
投稿日時: 2003-07-07 17:41
まりりさん、返信ありがとうございます。

処理が終了というのはHTTPレスポンスを返した後のことです。

また、メモリを食い潰すというのは、プロセスの数が増え続け、
psコマンドで見たときに、HTTPレスポンスを返しているのに
/usr/java/j2sdk1.4.1_03/bin/java -server -Xmx128M -Xms64....
のプロセスがそのまま残り増え続けてしまうということです。

よろしくお願いいたします。
おっきー
大ベテラン
会議室デビュー日: 2003/05/01
投稿数: 104
投稿日時: 2003-07-07 19:09
サーブレットはマルチスレッドで動作しますので、
瞬間的にアクセスがあった場合は、スレッドが残っている状態が
しばらく続くのが普通だと思います。
あまり詳しくないのですが、おそらく残ったスレッドはプールに
貯蔵されて次のアクセスが来た場合、使いまわされるようになっているはずです。
(設定されたプロセス数の最大値を超えたら問題ありですけど。)

アクセス数が少ないのに
CPUの負荷が100%になったり、プロセス数がどんどん増えていったりという
経験が何度かあります。(しかも運用中に^^;)

その場合、大抵プログラムのミスor環境設定のミスが原因でした。
例えば、
o ある文字が来た場合のみ無限ループするようになっていた。(普段は表に出てませんでした。)
o 名前解決がうまくいかなくなっていて、JavaMailでメールが送れずプロセスがどんどんたまっていった。

などです。
まりり
ぬし
会議室デビュー日: 2001/12/05
投稿数: 329
投稿日時: 2003-07-08 02:24
おっきーさんがおっしゃっているようにServletは1プロセスで複数の処理を行います。
ですので、レスポンスが返ったからといってプロセスが消えるとは限りません。
(ここが典型的なCGIとの大きな違いです)

単にプロセスが残り続けることで不思議に思っていたのでしたら正常だと思います。
ただこれだと「メモリを食いつぶす」という表現には遠い気がします。
他にも何か現象が起きてます?
shinmai
会議室デビュー日: 2003/03/12
投稿数: 5
投稿日時: 2003-07-08 10:28
返信ありがとうございます。

皆様のご指摘通り、瞬間的にアクセス数を増加させると、
Tomcatのserver.xmlで設定しているmaxProccessorの値より
やや多い数のスレッドが生成され、レスポンスを返した後も
スレッドがそのまま残り続けます。(Tomcat終了時まで)

各スレッドが使用し続けるメモリ量が、
この投稿に示したサンプルでも43Mとなるため、
生成するスレッド数を多くしすぎると空きメモリを0となってしまいます。
その状態でアクセスされると
「Internal Server Error 500」
が表示され、Tomcatのログに
「No processor available, rejecting this connection」
が残りました。


当初、プログラムミスを疑ったのですが、サンプルでも同様の結果と
なるため、環境設定の調べつつも、
負荷テストの結果、生成されるスレッド数は
maxProccessorの値を大きく超える事はなさそうなので、
この値をうまく調整する事で対応できるのでは?と
思っております。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2003-07-08 10:48
unibon です。こんにちわ。
#あまりよくは知らないのですが。

引用:

shinmaiさんの書き込み (2003-07-07 14:46) より:
その際に、Tomcat起動中にpsコマンドで確認すると
処理を終了したJavaのプロセスがそのまま残り、
数が増え続けてメモリを食い潰してしまう現象に陥っています。


私は Linux の知識はほとんどないのですが、
ps コマンドでプロセスとして見えるのは、実態はスレッドだと思いますが、
それで合っているでしょうか
(実態も「プロセス」と呼ぶほうが正しいのかもしれませんが)。
とにかく、すなわち Java VM のプロセスがいくつも立ち上がるわけではないのですよね。

引用:

shinmaiさんの書き込み (2003-07-07 14:46) より:

public class sleep2 extends HttpServlet {



クラス名が sleep2 なのが気になるのですが、
提示されたコード以外で、なにか sleep に類する処理をされているのでしょうか。
また、Tomcat に付属するサンプルのままでもその現象が起きるのでしょうか。

あと、あまり関係ないかもしれませんが、
引用:

shinmaiさんの書き込み (2003-07-07 14:46) より:

response.setHeader("Connection", "close");

out.flush();
out.close();
out = null;



あたりのコードは取っ払っても良いと思うのですが、どうでしょうか。
1

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