FreeBSD 4-STABLEでmod_jk2を使う

はじめに

FreeBSD で mod_jk/mod_jk2 を使って Apache2.0 と Tomdcat4 をつなげる を書いてから、一年以上が経過した。 その間に、世の中だいぶ便利になっており、mod_jk2 も ports として提供されるようになった。 そこで今回、ports を利用して、Apache2.0 と Jakarta Tomcat 5.0 を mod_jk2 を使ってつなげてみた。

使用した FreeBSD のバージョンは、2004年5月8日時点の FreeBSD 4.10-PRERELEASE #1 である。

必要なプログラムをインストールする

プログラムは、すべて ports を使ってインストールした。 インストールした ports の一覧は、以下の通りである(依存関係により、リストした以外の ports もいくつかインストールされる)。

origin ports
www/apache2 apache-2.0.49
apache-worker-2.0.49
java/jdk14 jdk-1.4.2p6_4
www/jakarta-tomcat5 jakarta-tomcat-5.0.19
www/mod_jk2-apache2 mod_jk2-apache2-2.0.2

Apache2.0 は、MPM に prefork を使用した場合と worker を使用した場合の二通りについて試した。 デフォルトインストールでは prefork となり、make 時にオプション WITH_MPM=worker を指定すると worker となる。

mod_jk2 は make 時に、インストールされている Apache2.0 に合わせてコンパイルオプションが設定される。 また、mod_jk2 のコンパイル時に参照される /usr/local/include/apache2 以下のヘッダファイルも、Apache2.0 のビルド方法によって異なった内容となる。 このため、MPM を切り替えて Apache2.0 を再インストールした場合、mod_jk2 も make しなおす必要がある。

mod_jk2 を設定する

httpd.conf の編集

/usr/local/etc/apache2/httpd.conf を以下のように編集する。

モジュール mod_jk2.so をロードする部分を、次のように先頭の # を削除して有効にする。

LoadModule jk2_module libexec/apache2/mod_jk2.so

workers2.properties の位置を指定するため、次の記述を追加する。

<IfModule mod_jk2.c>
  JkSet config.file /usr/local/etc/apache2/workers2.properties
</IfModule>

workers2.properties の作成

ディレクトリ /usr/local/etc/apache2 に、ファイル workers2.properties を作成する。 以下は、Tomcat の example を apache 経由で利用する場合の設定である。

workers2.properties
[shm]
info=Scoreboard. Requried for reconfiguration and status with multiprocess servers.
file=anon

# Defines a load balancer named lb. Use even if you only have one machine.
[lb:lb]

# Example socket channel, override port and host.
[channel.socket:localhost:8009]
port=8009
host=127.0.0.1

# define the worker
[ajp13:localhost:8009]
channel=channel.socket:localhost:8009
group=lb

# Map the Tomcat examples webapp to the Web server uri space
[uri:/servlets-examples/*]
group=lb

[uri:/jsp-examples/*]
group=lb

[status:]
info=Status worker, displays runtime information

[uri:/jkstatus/*]
info=The Tomcat /jkstatus handler
group=status:

動かしてみる

Tomcat と Apache2 を ports でインストールした場合、FreeBSD のブート時に Tomcat と Apache2 が順に起動される。

インストール直後などにこれらを手動で起動したい場合は、以下のコマンドを実行する。

# /usr/local/etc/rc.d/020.jakarta-tomcat50.sh start
# /usr/local/etc/rc.d/apache2.sh start

Tomcat と Apache の起動後、ブラウザで http://hogehoge/servlets-examples/servlet/HelloWorldExample などにアクセスすると、サーブレットが起動され、ブラウザにサーブレットが生成したレスポンスが表示される。 また、http://hogehoge/jkstatus/ にアクセスすると、mod_jk2 の状態がブラウザの画面に表示される。

一年前と同様、Apache2 の起動時に /var/log/httpd-error.log に次のエラーが出力されるが、ブラウザからのリクエストは正常に処理されており、特に障害が発生することはなかった。

[error] mod_jk child init 1 0

性能を測定してみる

測定方法

Apache に付属の Apache Benchmark を使って、性能を測定してみた。

テストに使用したマシンは、 Pentium II 400 MHz 、実メモリ 256 メガバイトである。 サーブレットを動作させるにはスペックが低い環境であるが、とりあえずすぐに使えるマシンがこんなものしかなかったのでご勘弁を。

FreeBSD のカーネルは、/boot/loader.conf に以下を記述して利用可能なソケット数を増やすようにしてある。

kern.ipc.maxsockets=65535

Apache2.0 と Tomcat の設定は、デフォルトのままである。

別マシンから、以下のコマンドを実行することにより性能を測定した。

$ ab -c 1 -n 10000 -g hello1.dat \
    http://hogehoge/servlets-examples/servlet/HelloWorldExample > hello1.txt
$ ab -c 2 -n 10000 -g hello2.dat \
    http://hogehoge/servlets-examples/servlet/HelloWorldExample > hello2.txt
$ ab -c 5 -n 10000 -g hello5.dat \
    http://hogehoge/servlets-examples/servlet/HelloWorldExample > hello5.txt
$ ab -c 10 -n 10000 -g hello10.dat \
    http://hogehoge/servlets-examples/servlet/HelloWorldExample > hello10.txt
$ ab -c 20 -n 10000 -g hello20.dat \
    http://hogehoge/servlets-examples/servlet/HelloWorldExample > hello20.txt
$ ab -c 50 -n 10000 -g hello50.dat \
    http://hogehoge/servlets-examples/servlet/HelloWorldExample > hello50.txt
上記は、並列度 1, 2, 5, 10, 20, 50 それぞれに対して、Tomcat の HelloWorldExample を合計 10000 回リクエストし、性能測定を行っている。

なお、今回の性能測定では、一年前のようにタイムアウトなどのエラーが発生するようなことはなく、リクエストはすべて正常に終了した。

測定結果

各テストにおけるリクエストの処理時間を以下の各表に示す。

MPM が prefork 場合の処理時間 (単位はミリ秒)
並列度 最小値 平均値 標準偏差 中間値 最大値
1 3 4 1.0 4 39
2 3 8 1.9 8 83
5 3 21 3.8 21 57
10 3 44 28.1 42 1235
20 4 91 40.9 88 2285
50 21 239 118.0 225 3131
MPM が worker 場合の処理時間(単位はミリ秒)
並列度 最小値 平均値 標準偏差 中間値 最大値
1 3 5 1.2 5 56
2 4 10 9.5 10 625
5 4 26 8.2 26 94
10 4 54 19.4 53 279
20 5 114 111.1 108 3561
50 4 316 79.2 302 1204
Tomcat の HTTP コネクタに直接アクセスした場合の処理時間(単位はミリ秒)
並列度 最小値 平均値 標準偏差 中間値 最大値
1 2 3 1.1 3 29
2 3 6 1.8 6 39
5 3 15 3.2 15 49
10 4 33 20.1 31 654
20 7 65 6.4 63 135
50 7 168 15.9 172 504

次の図は、リクエストの処理時間の平均値をグラフにしたものである。 グラフの横軸は並列度である。 tomcat http とあるのは、Apache を経由させずに Tomcat の HTTP コネクタに直接アクセスした場合である。 並列度に比例して処理時間が増加していることから、CPU がほぼいっぱいいっぱいのようである。

次の図は、1秒当りの平均リクエスト回数をグラフにしたものである。 グラフの横軸は並列度である。 並列度が増すと逆に平均リクエスト回数が減っていることから、やはり CPU がいっぱいいっぱいのようである。

以降は、各リクエストの処理時間を並列度毎にグラフにしたものである。 グラフの横軸は、テスト開始時刻を 0 としたときのリクエスト発行時刻である。 一年前の結果に比べると、性能がかなり安定していることがわかる。