イベント駆動で書くと

クラウド破産を回避できたり、自宅サーバを守れるというメリットがあるらしいので、どうせなら epoll を使ってみようということで。

http://d.hatena.ne.jp/odz/20070507/1178558340http://alpha.mixi.co.jp/blog/?p=76 と man が参考に。某所経由で id:koizuka 氏にいろいろ教わり助かりました。

nginx 速すぎで大変悲しい結果に。

ソース

http://d.hatena.ne.jp/odz/20070507/1178558340 の勝手 fork です。問題/間違い等あれば連絡いただければありがたいです。エラー処理は省略気味。

ベンチマーク

それぞれ debian 上で epoll_sample, nginx, Apache2 を実行。nginx, apache2 ともに apt-get install で持ってきて設定はデフォルトのまま。

epoll_sample
# ab -n 10000 -c 50 http://localhost:8080/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to 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
Completed 10000 requests
Finished 10000 requests


Server Software:        
Server Hostname:        localhost
Server Port:            8080

Document Path:          /
Document Length:        7 bytes

Concurrency Level:      50
Time taken for tests:   20.125 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      710142 bytes
HTML transferred:       70014 bytes
Requests per second:    496.91 [#/sec] (mean)
Time per request:       100.623 [ms] (mean)
Time per request:       2.012 [ms] (mean, across all concurrent requests)
Transfer rate:          34.46 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        3   46  12.6     46     117
Processing:     9   48  13.8     48     241
Waiting:        0   32  15.2     35     239
Total:         32   95  23.2     94     244

Percentage of the requests served within a certain time (ms)
  50%     94
  66%     96
  75%     99
  80%    101
  90%    109
  95%    135
  98%    168
  99%    178
 100%    244 (longest request)
nginx
# ab -n 10000 -c 50 http://localhost:80/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to 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
Completed 10000 requests
Finished 10000 requests


Server Software:        nginx/0.6.32
Server Hostname:        localhost
Server Port:            80

Document Path:          /
Document Length:        151 bytes

Concurrency Level:      50
Time taken for tests:   22.493 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      3627602 bytes
HTML transferred:       1513171 bytes
Requests per second:    444.58 [#/sec] (mean)
Time per request:       112.465 [ms] (mean)
Time per request:       2.249 [ms] (mean, across all concurrent requests)
Transfer rate:          157.50 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        3   54   9.6     53     128
Processing:    33   57  11.1     54     139
Waiting:        7   46  12.1     46     134
Total:         64  112  15.2    107     230

Percentage of the requests served within a certain time (ms)
  50%    107
  66%    111
  75%    113
  80%    114
  90%    119
  95%    146
  98%    171
  99%    182
 100%    230 (longest request)
Apache2
# ab -n 10000 -c 50 http://localhost:80/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to 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
Completed 10000 requests
Finished 10000 requests


Server Software:        Apache/2.2.9
Server Hostname:        localhost
Server Port:            80

Document Path:          /
Document Length:        45 bytes

Concurrency Level:      50
Time taken for tests:   31.275 seconds
Complete requests:      10000
Failed requests:        0
Write errors:           0
Total transferred:      3204993 bytes
HTML transferred:       452115 bytes
Requests per second:    319.74 [#/sec] (mean)
Time per request:       156.377 [ms] (mean)
Time per request:       3.128 [ms] (mean, across all concurrent requests)
Transfer rate:          100.07 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:       46   74  16.8     70     194
Processing:    51   81  16.9     81     211
Waiting:        3   52  28.2     53     172
Total:        138  155  20.2    149     401

Percentage of the requests served within a certain time (ms)
  50%    149
  66%    153
  75%    156
  80%    158
  90%    169
  95%    198
  98%    230
  99%    238
 100%    401 (longest request)