Linux - Ab(Apache Bench)を使用した負荷テストのやり方 - Qiita
こちらを参考に、KeyValue型DBを使っているCGIの負荷テストを行います。
クイズアプリのジャンル別正解数集計に使用しています。
同時接続5で、トータル20アクセスで試験
ab -n 20 -c 5 "http://localhost/memo/unity.cgi?a=get&k=e_GOOD1"
結果
Concurrency Level: 5 Time taken for tests: 0.840012 seconds Complete requests: 20 Failed requests: 0 Write errors: 0 Total transferred: 3056 bytes HTML transferred: 60 bytes Requests per second: 23.81 [#/sec] (mean) Time per request: 210.003 [ms] (mean) Time per request: 42.001 [ms] (mean, across all concurrent requests) Transfer rate: 2.38 [Kbytes/sec] received
localhostってのもありますが、1リクエスト42msecで、1秒間に23リクエスト捌いてますね。
同時5の40リクエストにすると、
Requests per second: 26.38 [#/sec] (mean) Time per request: 37.913 [ms] (mean, across all concurrent requests)
さすが速いです。
CGIを常駐型のspeedyCGIに変更
Concurrency Level: 5 Time taken for tests: 0.148140 seconds Complete requests: 40 Failed requests: 0 Write errors: 0 Total transferred: 5960 bytes HTML transferred: 120 bytes Requests per second: 270.01 [#/sec] (mean) Time per request: 18.517 [ms] (mean) Time per request: 3.704 [ms] (mean, across all concurrent requests) Transfer rate: 33.75 [Kbytes/sec] received
1リクエスト3msで、1秒間に270リクエスト
激速です(ゝω・)
逆に言うと、Perlのプロセスを作るのに、42-3.7=38.3msかかるってことですね。
perlも実行時にコンパイルされてたと思うので、コンパイルにかかる時間もあるでしょうね。
speedyCGIで常駐して、TokyoCabinetを使って、get/setするCGI
addが便利。これでわざわざgetしてsetしないでいい。
#!/usr/bin/speedy -- -M2 use CGI::Carp qw(fatalsToBrowser); use CGI; use Jcode; use TokyoTyrant; our $cgi = CGI->new; print CGI::header(-charset=>"utf-8"); our $key = $cgi->param('k'); our $value = $cgi->param('v'); our $act = $cgi->param('a'); chomp($value); our $tb = TokyoTyrant::RDB->new(); $tb->open( "localhost", 1978); if($act eq "add") { my $temp = $tb->get( $key ); chomp($temp); $value = int($temp)+int($value); $tb->put( $key , $value ); print $value; } elsif($act eq "set") { $tb->put( $key , $value ); print $value; } elsif($act eq "get") { $value = $tb->get( $key ); print $value; } $tb->close(); exit;