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 しなおす必要がある。
/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>
ディレクトリ /usr/local/etc/apache2 に、ファイル workers2.properties を作成する。 以下は、Tomcat の example を apache 経由で利用する場合の設定である。
[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 回リクエストし、性能測定を行っている。
なお、今回の性能測定では、一年前のようにタイムアウトなどのエラーが発生するようなことはなく、リクエストはすべて正常に終了した。
各テストにおけるリクエストの処理時間を以下の各表に示す。
| 並列度 | 最小値 | 平均値 | 標準偏差 | 中間値 | 最大値 |
|---|---|---|---|---|---|
| 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 |
| 並列度 | 最小値 | 平均値 | 標準偏差 | 中間値 | 最大値 |
|---|---|---|---|---|---|
| 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 |
| 並列度 | 最小値 | 平均値 | 標準偏差 | 中間値 | 最大値 |
|---|---|---|---|---|---|
| 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 としたときのリクエスト発行時刻である。 一年前の結果に比べると、性能がかなり安定していることがわかる。