bird不思議な結果?(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 だとどうなりますかね。