とりあえず測定してみた(tcpcgi-0.3/tcpcgi-server無し)。
尚、測定サーバにはapacheをインストールしていない為、通常のcgiやfastcgiとの速度差は測っていません。
gs-alphaサーバでは、40000番にて、tcpserver+tcpcgiを動作させている(註:ベンチマークテスト時のみです。本番運用時は127.0.0.1:40000にbindさせるので、外部からはアクセスできません)。
そこへ、外部サーバからabをかけてみる。
/usr/local/apache/bin/ab \
-n 1000 -c 1 \
http://gs-alpha.tir.jp:40000/wiliki
This is ApacheBench, Version 1.3d <$Revision: 1.70 $> 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 gs-alpha.tir.jp (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Finished 1000 requests
Server Software: tcpcgi/0.3
Server Hostname: gs-alpha.tir.jp
Server Port: 40000
Document Path: /wiliki
Document Length: 1087 bytes
Concurrency Level: 1
Time taken for tests: 479.456 seconds
Complete requests: 1000
Failed requests: 0
Broken pipe errors: 0
Total transferred: 1268000 bytes
HTML transferred: 1087000 bytes
Requests per second: 2.09 [#/sec] (mean)
Time per request: 479.46 [ms] (mean)
Time per request: 479.46 [ms] (mean, across all concurrent requests)
Transfer rate: 2.64 [Kbytes/sec] received
Connnection Times (ms)
min mean[+/-sd] median max
Connect: 9 10 0.4 10 17
Processing: 289 470 145.6 509 721
Waiting: 277 469 145.6 509 720
Total: 289 479 146.0 519 731
Percentage of the requests served within a certain time (ms)
50% 519
66% 591
75% 622
80% 633
90% 653
95% 663
98% 675
99% 681
100% 731 (last request)
え、「毎秒2リクエストの応答速度?そんなの駄目駄目じゃん」って?
そこで、abに-kオプションを投入してみる。
/usr/local/apache/bin/ab \
-k -n 1000 -c 1 \
http://gs-alpha.tir.jp:40000/wiliki
(省略)
Concurrency Level: 1
Time taken for tests: 62.675 seconds
Complete requests: 1000
Failed requests: 0
Broken pipe errors: 0
Keep-Alive requests: 1000
Total transferred: 1295000 bytes
HTML transferred: 1087000 bytes
Requests per second: 15.96 [#/sec] (mean)
Time per request: 62.67 [ms] (mean)
Time per request: 62.67 [ms] (mean, across all concurrent requests)
Transfer rate: 20.66 [Kbytes/sec] received
Connnection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.3 0 9
Processing: 57 62 11.3 60 288
Waiting: 56 62 11.3 59 287
Total: 57 62 11.4 60 297
(省略)
毎秒16リクエストの速度になった。
しかし、まだまだ。
そこで、abの並列度を上げて、-c 10にしてみる。
/usr/local/apache/bin/ab \
-k -n 1000 -c 10 \
http://gs-alpha.tir.jp:40000/wiliki
(省略)
Concurrency Level: 10
Time taken for tests: 10.239 seconds
Complete requests: 1000
Failed requests: 0
Broken pipe errors: 0
Keep-Alive requests: 1000
Total transferred: 1295051 bytes
HTML transferred: 1087000 bytes
Requests per second: 97.67 [#/sec] (mean)
Time per request: 102.39 [ms] (mean)
Time per request: 10.24 [ms] (mean, across all concurrent requests)
Transfer rate: 126.48 [Kbytes/sec] received
Connnection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 1.1 0 13
Processing: 58 102 204.5 75 2633
Waiting: 58 101 204.5 75 2633
Total: 58 102 205.7 75 2646
(省略)
大体、毎秒100リクエストの速度になった。コレならfcgiやmod_言語名に余裕で勝てる(……と言いたいものの、ちゃんと速度比較していないので、実際の真偽は不明)。
だが、アクセスしてくるクライアントはバラバラなので、通常は、abの-kの速度はまず出ない。
そこで、reverse proxyとして、squidを設置する。
squidはgs-alphaサーバの80番で待ち受け、localhost:40000のtcpserver+tcpcgiからデータを取得し、クライアントへ返す。当然、Keep-Aliveは最大限に活用してくれる。
/usr/local/apache/bin/ab \
-n 1000 -c 1 \
http://gs-alpha.tir.jp/wiliki
This is ApacheBench, Version 1.3d <$Revision: 1.70 $> 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 gs-alpha.tir.jp (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Finished 1000 requests
Server Software: tcpcgi/0.3
Server Hostname: gs-alpha.tir.jp
Server Port: 80
Document Path: /wiliki
Document Length: 1087 bytes
Concurrency Level: 1
Time taken for tests: 72.017 seconds
Complete requests: 1000
Failed requests: 0
Broken pipe errors: 0
Total transferred: 1364000 bytes
HTML transferred: 1087000 bytes
Requests per second: 13.89 [#/sec] (mean)
Time per request: 72.02 [ms] (mean)
Time per request: 72.02 [ms] (mean, across all concurrent requests)
Transfer rate: 18.94 [Kbytes/sec] received
Connnection Times (ms)
min mean[+/-sd] median max
Connect: 9 10 1.1 10 41
Processing: 59 61 10.1 59 281
Waiting: 57 61 10.1 58 280
Total: 67 71 10.2 69 290
Percentage of the requests served within a certain time (ms)
50% 69
66% 69
75% 70
80% 70
90% 71
95% 95
98% 96
99% 97
100% 290 (last request)
間にsquidが入った分と、abとsquidの間は毎回コネクションを切断する分で、若干処理速度が落ち、毎秒14回にはなったが、それでも充分高速だ。
また、実際にはアクセスは並列に起こるので、-k無しで-c 10でも試してみる。
/usr/local/apache/bin/ab \
-n 1000 -c 10 \
http://gs-alpha.tir.jp/wiliki
(省略)
Concurrency Level: 10
Time taken for tests: 11.388 seconds
Complete requests: 1000
Failed requests: 0
Broken pipe errors: 0
Total transferred: 1364000 bytes
HTML transferred: 1087000 bytes
Requests per second: 87.81 [#/sec] (mean)
Time per request: 113.88 [ms] (mean)
Time per request: 11.39 [ms] (mean, across all concurrent requests)
Transfer rate: 119.78 [Kbytes/sec] received
Connnection Times (ms)
min mean[+/-sd] median max
Connect: 10 16 5.3 15 64
Processing: 35 97 186.1 74 2589
Waiting: 21 97 186.1 73 2589
Total: 35 113 186.8 90 2614
(省略)
それでも、毎秒88回。
どうです?この際、perlなんか捨てて、コレからはschemeで巨大ウェブサービスを構築してみませんか?
とりあえず、自分はschemeで巨大ウェブサービスを構築します。遊びで。
(会社では、残念な事に、perl仕事……)