AIプログラムとかUnityゲーム開発について

探索や学習などを活用したAI系ゲームを作りたいと思います。

データベースの負荷テスト

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;