閒的沒事,拿一臺淘汰的2950做了做nginx和lighttpd的效能對比,可以在選擇webserver上做個參考。
測試環境如下
Dell2950 4G記憶體,FreeBSD 8.2 release
#sysctl -a | grep CPU
hw.model: Intel(R) Xeon(R) CPU                        5130    @ 2.00GHz

2×2顆

記憶體4G

#uname -a
FreeBSD localhost.localdomain 8.2-RELEASE

php5.2.17,fastcgi方式,預設5程式測試,失敗請求太多,改用20程式,無請求失敗。
Nginx主要配置
events {
    use kqueue;
    worker_connections  102400;
}
寫了個phpinfo用ab測試,內網IP,不考慮頻寬因素。
# ab -n 100000 -c 1000 http://192.168.100.28/info.php
This is ApacheBench, Version 1.3d <$Revision: 1.73 $> apache-1.3
Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright (c) 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking 192.168.100.28 (be patient)
Completed 10000 requests
Completed 20000 requests
Completed 30000 requests
Completed 40000 requests
Completed 50000 requests
Completed 60000 requests
Completed 70000 requests
Completed 80000 requests
Completed 90000 requests
Finished 100000 requests
Server Software:                nginx/1.0.0                                                                                
Server Hostname:                192.168.100.28
Server Port:                        80

Document Path:                    /info.php
Document Length:                49457 bytes

Concurrency Level:            1000
Time taken for tests:     86.578 seconds
Complete requests:            100000
Failed requests:                0
Broken pipe errors:         0
Total transferred:            4977355920 bytes
HTML transferred:             4961202790 bytes
Requests per second:        1155.03 [#/sec] (mean)
Time per request:             865.78 [ms] (mean)
Time per request:             0.87 [ms] (mean, across all concurrent requests)
Transfer rate:                    57489.84 [Kbytes/sec] received

Connnection Times (ms)
                            min    mean[+/-sd] median     max
Connect:                0     297    888.8         11    6414
Processing:        20     555    649.9        421    9989
Waiting:             18     555    649.9        421    9988
Total:                 20     852 1065.3        473 10222

Percentage of the requests served within a certain time (ms)
    50%        473
    66%        584
    75%        699
    80%        776
    90%     3308
    95%     3473
    98%     3688
    99%     3817
100%    10222 (last request)

iostat -w 1
       tty           mfid0              da0              cd0             cpu
 tin  tout  KB/t tps  MB/s   KB/t tps  MB/s   KB/t tps  MB/s  us ni sy in id
   0    23 19.12   1  0.01   0.01   0  0.00   0.00   0  0.00   0  0  0  0 100
   0   235  0.00   0  0.00   0.00   0  0.00   0.00   0  0.00   0  0  0  0 100
   0    79  2.00   3  0.01   0.00   0  0.00   0.00   0  0.00   0  0  0  0 100
   4   393  2.00   2  0.00   0.00   0  0.00   0.00   0  0.00  10  0  4  2 85
   0    78 123.85  54  6.52   0.00   0  0.00   0.00   0  0.00  76  0 17  7  0
   0    76 128.00   1  0.12   0.00   0  0.00   0.00   0  0.00  72  0 16  8  5
   0    79 128.00   1  0.12   0.00   0  0.00   0.00   0  0.00  81  0 12  5  2
   0    79 128.00   1  0.12   0.00   0  0.00   0.00   0  0.00  74  0 15  7  3
   0    79 16.95  19  0.31   0.00   0  0.00   0.00   0  0.00  71  0 19  8  2
   0    78 21.60  10  0.21   0.00   0  0.00   0.00   0  0.00  74  0 17  7  2
   0    78  0.00   0  0.00   0.00   0  0.00   0.00   0  0.00  74  0 17  8  1
   0    78 53.33   3  0.16   0.00   0  0.00   0.00   0  0.00  68  0 21 10  1
   0   104 20.20  20  0.39   0.00   0  0.00   0.00   0  0.00  68  0 18 10  5

磁碟壓力只在測試開始時大,並且因為所有東西都放在一臺伺服器,瞬間最高把CPU空閒率幹到了0.3%,但實際上佔用CPU最多的是ab,佔了40%多,nginx佔用不到40%

————————————————換lighttpd
server.max-fds = 8192
## 
## Stat() call caching.
##
## lighttpd can utilize FAM/Gamin to cache stat call.
##
## possible values are:
## disable, simple or fam.
##
server.stat-cache-engine = “simple”
##
## Fine tuning for the request handling
##
## max-connections == max-fds/2 (maybe /3)
## means the other file handles are used for fastcgi/files
##
Server.max-connections = 4096
也是使用kqueue佇列
# ab -n 100000 -c 1000 http://192.168.100.28/info.php
This is ApacheBench, Version 1.3d <$Revision: 1.73 $> apache-1.3
Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright (c) 2006 The Apache Software Foundation, http://www.apache.org/

Benchmarking 192.168.100.28 (be patient)
Completed 10000 requests
Completed 20000 requests
Completed 30000 requests
Completed 40000 requests
Completed 50000 requests
Completed 60000 requests
Completed 70000 requests
Completed 80000 requests
Completed 90000 requests
Finished 100000 requests
Server Software:                lighttpd/1.4.28                                                                        
Server Hostname:                192.168.100.28
Server Port:                        80

Document Path:                    /info.php
Document Length:                49127 bytes

Concurrency Level:            1000
Time taken for tests:     83.107 seconds
Complete requests:            100000
Failed requests:                0
Broken pipe errors:         0
Total transferred:            4932575365 bytes
HTML transferred:             4915304142 bytes
Requests per second:        1203.27 [#/sec] (mean)
Time per request:             831.07 [ms] (mean)

Time per request:             0.83 [ms] (mean, across all concurrent requests)
Transfer rate:                    59352.10 [Kbytes/sec] received

Connnection Times (ms)
                            min    mean[+/-sd] median     max
Connect:                0        19    206.2            1    3113
Processing:        79     807    155.8        823    3891
Waiting:             66     807    155.8        823    3890
Total:                 79     826    251.0        826    4248

Percentage of the requests served within a certain time (ms)
    50%        826
    66%        843
    75%        854
    80%        862
    90%        894
    95%        939
    98%     1006
    99%     1094
100%     4248 (last request)

# iostat -w 1
       tty           mfid0              da0              cd0             cpu
 tin  tout  KB/t tps  MB/s   KB/t tps  MB/s   KB/t tps  MB/s  us ni sy in id
   0    23 19.25   1  0.01   0.01   0  0.00   0.00   0  0.00   0  0  0  0 100
   0   387  0.00   0  0.00   0.00   0  0.00   0.00   0  0.00   0  0  0  0 99
   0    78  0.00   0  0.00   0.00   0  0.00   0.00   0  0.00   0  0  0  0 100
   4  2185  0.00   0  0.00   0.00   0  0.00   0.00   0  0.00  47  0 14  7 33
   0    78 120.00   2  0.23   0.00   0  0.00   0.00   0  0.00  68  0 23  9  1
   0  2405 128.00   1  0.12   0.00   0  0.00   0.00   0  0.00  77  0 14  6  2
   0    79 128.00   1  0.12   0.00   0  0.00   0.00   0  0.00  71  0 17 10  2
   0  1852 128.00   1  0.12   0.00   0  0.00   0.00   0  0.00  72  0 18  8  2
   0    79 128.00   1  0.12   0.00   0  0.00   0.00   0  0.00  62  0 22  7 10
   0  1143 128.00   1  0.12   0.00   0  0.00   0.00   0  0.00  68  0 20  9  3
   0    79 128.00   1  0.12   0.00   0  0.00   0.00   0  0.00  65  0 25  8  2
   0  2074 128.00   1  0.12   0.00   0  0.00   0.00   0  0.00  69  0 22  8  2
   0    79 128.00   1  0.12   0.00   0  0.00   0.00   0  0.00  65  0 23 10  3
   0  1917 128.00   1  0.12   0.00   0  0.00   0.00   0  0.00  62  0 26 10  3
   0    79 128.00   1  0.12   0.00   0  0.00   0.00   0  0.00  63  0 25  8  5
   0  2247 128.00   1  0.12   0.00   0  0.00   0.00   0  0.00  66  0 23  8  3
   0    79 128.00   1  0.12   0.00   0  0.00   0.00   0  0.00  66  0 25  7  2
   0  1373 48.00   7  0.33   0.00   0  0.00   0.00   0  0.00  66  0 22  8  4

看起來,lighttpd在磁碟上並沒有nginx那樣的瞬間壓力。
總結:
一開始的失敗請求主要來自php-cgi,在此伺服器上,預設程式數無法處理大併發訪問量。改為20以上就不存在失敗了,再高收益不大。從高負載動態頁面吞吐率上說,lighttpd可能要稍稍高於nginx。
附ab靜態頁面吞吐率
lighttpd Requests per second:    9045.68 [#/sec] (mean)
nginx  Requests per second:    11622.50 [#/sec] (mean)
處理靜態頁面上,nginx要比lighttpd快不少。如果去掉ab對cpu的壓力,兩款軟體加php對cpu的壓力應該不超過70%。
在處理諸如php,ror等應用方面的極端壓榨,可以考慮使用lighttpd。處理靜態頁面可以考慮使用nginx。篇幅有限,vmstat和truss跟蹤的結果就不貼了。