とりあえず測定してみた(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仕事……)