不思議な結果?(2)
不思議な結果?(2)
CGI や FastCGI、Servlet 等の性能を評価していた時のこと。
ふと戯れに (ってそればっかりだな…) apache と tomcat の Coyote で、通常のファイル送出性能にどれくらいの差があるのか調べてみたくなりました。
環境は昨日と同じです。性能測定には ab (apache bench) を使いました。
さて、まず apache。手元の環境は Debian woody、apache の version は 1.3.26 です。
kazawa@tpx20:~$ ab -c 20 -n 10000 http://localhost/hello.html
This is ApacheBench, Version 1.3d <$Revision: 1.65 $> apache-1.3
Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright (c) 1998-2002 The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Finished 10000 requests
Server Software: Apache/1.3.26
Server Hostname: localhost
Server Port: 80
Document Path: /hello.html
Document Length: 92 bytes
Concurrency Level: 20
Time taken for tests: 19.021 seconds
Complete requests: 10000
Failed requests: 0
Broken pipe errors: 0
Total transferred: 3560000 bytes
HTML transferred: 920000 bytes
Requests per second: 525.73 [#/sec] (mean)
Time per request: 38.04 [ms] (mean)
Time per request: 1.90 [ms] (mean, across all concurrent requests)
Transfer rate: 187.16 [Kbytes/sec] received
Connnection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.2 0 10
Processing: 1 37 101.9 26 2658
Waiting: 1 37 101.9 26 2658
Total: 1 37 101.9 26 2658
Percentage of the requests served within a certain time (ms)
50% 26
66% 28
75% 29
80% 30
90% 33
95% 38
98% 175
99% 531
100% 2658 (last request)
毎秒500回ちょっとですか。この時は妙に結果がばらつくのが気になりました。あ、昨日と同じで、何回か実行して結果が安定してきたところを見ています。
さて、次に tomcat です。tomcat のバージョンは 5.0.19、JavaVM は最新のものを持ってきて 1.5.0β1 を使ってみました。
kazawa@tpx20:~$ ab -c 20 -n 10000 http://localhost:8080/hello.html
This is ApacheBench, Version 1.3d <$Revision: 1.65 $> apache-1.3
Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright (c) 1998-2002 The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Finished 10000 requests
Server Software: Apache-Coyote/1.1
Server Hostname: localhost
Server Port: 8080
Document Path: /hello.html
Document Length: 92 bytes
Concurrency Level: 20
Time taken for tests: 14.684 seconds
Complete requests: 10000
Failed requests: 0
Broken pipe errors: 0
Total transferred: 3133756 bytes
HTML transferred: 921104 bytes
Requests per second: 681.01 [#/sec] (mean)
Time per request: 29.37 [ms] (mean)
Time per request: 1.47 [ms] (mean, across all concurrent requests)
Transfer rate: 213.41 [Kbytes/sec] received
Connnection Times (ms)
min mean[+/-sd] median max
Connect: 0 14 7.1 13 147
Processing: 15 15 7.7 14 148
Waiting: 7 14 7.5 13 147
Total: 26 29 9.0 26 155
Percentage of the requests served within a certain time (ms)
50% 26
66% 27
75% 27
80% 28
90% 35
95% 38
98% 57
99% 70
100% 155 (last request)
むむむ。apache よりも速いですね。なお、デフォルト設定の tomcat から変更したところと言えば、
- JAVA_OPTS 環境変数に「-server」オプションをセット (HotSpot Server VM が利用される)。
- server.xml を編集してアクセスログが出力されるようにした (apache 側と条件を揃えるため)。
くらいです。あ、もちろん Server VM 使用、ということで、結果が安定するまで何回か (5〜6回) くらい ab を回し、JITC による最適化が行き渡るようにしています (最適化されるまでは4倍くらい遅いです)。
さて、ここまでの話だと「単純なファイル送出なら apache より tomcat 方が速い」という結論が出かねないわけですけれども、ここで、apache のテスト時に結果がばらついていたことを思い出しました。そこでテスト中の apache プロセスの状況を調べてみました。
すると、結構高い頻度で apache プロセスが起動したり終了したりしているらしいことが分かりました (defunct な apache プロセスがたびたび現れる)。手元の apache は woody のそれをインストールしたままの設定でしたが、性能に関係する主なパラメータの状況は下記のようになっていました。
MinSpareServers 5
MaxSpareServers 10
MaxClients 150
MaxRequestsPerChild 100
MaxClients が 150 なのはいいとして、MaxRequestsPerChild が 100、ってのはまたずいぶん安全よりな設定なんですね、woody は。
そこで、SpareServer が常に 20 以上存在するようにし、また MaxRequestsPerChild を 10000 に変更してもう一度テストしてみました。その結果が下記です。
kazawa@tpx20:~$ ab -c 20 -n 10000 http://localhost/hello.html
This is ApacheBench, Version 1.3d <$Revision: 1.65 $> apache-1.3
Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright (c) 1998-2002 The Apache Software Foundation, http://www.apache.org/
Benchmarking localhost (be patient)
Completed 1000 requests
Completed 2000 requests
Completed 3000 requests
Completed 4000 requests
Completed 5000 requests
Completed 6000 requests
Completed 7000 requests
Completed 8000 requests
Completed 9000 requests
Finished 10000 requests
Server Software: Apache/1.3.26
Server Hostname: localhost
Server Port: 80
Document Path: /hello.html
Document Length: 92 bytes
Concurrency Level: 20
Time taken for tests: 14.631 seconds
Complete requests: 10000
Failed requests: 0
Broken pipe errors: 0
Total transferred: 3560712 bytes
HTML transferred: 920184 bytes
Requests per second: 683.48 [#/sec] (mean)
Time per request: 29.26 [ms] (mean)
Time per request: 1.46 [ms] (mean, across all concurrent requests)
Transfer rate: 243.37 [Kbytes/sec] received
Connnection Times (ms)
min mean[+/-sd] median max
Connect: 0 2 2.6 1 30
Processing: 6 27 8.1 25 387
Waiting: 0 26 8.2 25 386
Total: 6 29 8.6 27 388
Percentage of the requests served within a certain time (ms)
50% 27
66% 28
75% 29
80% 30
90% 37
95% 49
98% 54
99% 57
100% 388 (last request)
これで、tomcat とほとんど変わらない性能が出るようになりました。apache って結構頻繁に SpareServer の回収を行ってるんですね。また、大量のアクセスが定常的に発生しているような場合は、常にたくさんのプロセスが立ちあがっているように設定しておかないと結構オーバーヘッドが大きいのですね。なるほどー。
というわけで、こちらはあんまり不思議な結果にはなりませんでした。一つ分かったのは、単純なファイル送出ならば tomcat Coyote でも十分な性能を持っていること。apache の持つ多彩な機能が必要ない場合は、安直に Coyote を使ってしまうのも悪くないのかもしれません。
コメント
- ささだ (Thu, 25 Mar 2004 03:32:04)
-
あぱちの2.x だとどうなりますかね。