« バソキヤ2006に涙したい | メイン | lighttpd-1.5.0-r1454 ベンチマーク »

lighttpd vs Perlbal

lighttpdのlinux-aioサポートの記事を読んでいて気になったので、既にaioをサポートしているPerlbalの静的コンテンツを配信するWebサーバとしての性能を調べてみた。

サーバは
CPU Pen4 2.8GHz ( HyperThreading付き)
Memory 512MB
FedoraCore6
な環境です。

上記の記事の様にファイルを3GBほど作成(メモリーより明らかに多い量)
小さい画像ファイルと見立てて、3KBのファイルを10*100*1000=1M個作成しました。

#/bin/bash
for i in `seq 1 10`; do 
  for k in `seq 1 100`; do 
    mkdir -p $i/$k; 
    for j in `seq 1 1000`; do 
      dd if=/dev/zero of=$i/$k/$j bs=3k count=1 2> /dev/null; 
    done; 
  done;
done


負荷試験はhttp_loadを使いました。
別のマシン(intel iMac 1.83GHz)からリクエストをかけています。
なお、このテストを行う前に、何度かパターンを変えながらテストを行っていて、いくつかのファイルについてはCacheに乗っているだろうという状態です。最後に以下の3つのテストを連続して行いました。

■lighttpd 1.4.13(fc6のrpm)
・設定

server.document-root="/var/www/html"
server.port=8080
server.event-handler="linux-sysepoll"


・結果

$ ./http_load-12mar2006/http_load -verbose -parallel 100 -fetches 10000 url_files
--- 60.0036 secs, 5396 fetches started, 5297 completed, 99 current
10000 fetches, 100 max parallel, 3.072e+07 bytes, in 114.526 seconds
3072 mean bytes/connection
87.3162 fetches/sec, 268235 bytes/sec
msecs/connect: 0.23497 mean, 4.966 max, 0.098 min
msecs/first-response: 1135.8 mean, 2108.87 max, 14.614 min
HTTP response codes:
  code 200 -- 10000


ただし、この時に、CPUのwaitが、50%に張り付いている(hyperthreadingで片方のCPUを使い切った状態?)

procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 0  1     64   6216 136024 223312    0    0   407   394 1593  252  0  1 49 50  0
 0  1     64   5984 136072 223584    0    0   417   376 1608  257  0  1 49 50  0
 0  1     64   6208 136032 223356    0    0   407   394 1604  252  0  1 49 50  0
 0  2     64   6568 136000 222848    0    0   346   722 1453  238  0  1 47 51  0
 0  1     64   5900 136032 223448    0    0   301   774 1388  233  0  2 49 49  0


なので、対応策として、max-workerを増やすしてさらにlighttpdのテスト

■lighttpd 1.4.13 max-worker=4
・設定

server.document-root="/var/www/html"
server.port=8080
server.max-worker=4
server.event-handler="linux-sysepoll"


・結果

$ ./http_load-12mar2006/http_load -verbose -parallel 100 -fetches 10000 url_files
--- 60 secs, 5808 fetches started, 5708 completed, 100 current
10000 fetches, 100 max parallel, 3.072e+07 bytes, in 107.158 seconds
3072 mean bytes/connection
93.3204 fetches/sec, 286680 bytes/sec
msecs/connect: 0.23277 mean, 4.663 max, 0.097 min
msecs/first-response: 1055.08 mean, 4238.66 max, 16.947 min
HTTP response codes:
  code 200 -- 10000


waitも50%を超えるようになって若干性能向上。

■Perlbal version 1.52
・設定

CREATE SERVICE websrv
  SET listen         = 0.0.0.0:8080
  SET role           = web_server
  SET docroot        = /var/www/html
  SET dirindexing    = 0
  SET persist_client = on
ENABLE websrv


・結果

./http_load-12mar2006/http_load -verbose -parallel 100 -fetches 10000 url_files
--- 60.0001 secs, 6573 fetches started, 6473 completed, 100 current
10000 fetches, 100 max parallel, 3.072e+07 bytes, in 96.3537 seconds
3072 mean bytes/connection
103.784 fetches/sec, 318825 bytes/sec
msecs/connect: 0.240852 mean, 4.551 max, 0.096 min
msecs/first-response: 480.681 mean, 3390.38 max, 80.841 min
HTTP response codes:
  code 200 -- 10000


■結果
結果からすれば、Perlbalの方が速い。これは意外だった。
cacheに乗り切らないファイルの量だと、epollだとか使ってても結局iowaitがボトルネックになる。aioはこの問題を解決する一つの方法かも。(Apacheだとここをthreadを増やしたり、プロセスを増やしたりで対応できていると思う)
ただ、Perlbalをユーザからのリクエストを受ける場所に持っていくのはちょっと抵抗があるなぁってことで、lighttpd 1.5に期待。