楽天ROMA/memcached/Tokyo Tyrant最速テスト
今回は冗長性等々は気にせずに,ひたすら速度のみ比較します.
なのでクライアントプログラムはc++で書きます.ほとんどCとしか使ってないですが.
プログラムはこんな感じ.30%の確率で書き込みが発生し,70%の確率で読み込みが発生する,これを10万回繰り返すという単純なもの.
#import <iostream> #include <time.h> #include <libmemcached/memcached.h> #include <SFMT.c> using namespace std; #define memcached_error(k,memc,rc)\ {fprintf(stderr, "test: key=%s: memcache error %s",\ (k), memcached_strerror((memc), (rc)));\ if (memc->cached_errno)\ fprintf(stderr, " system error %s", strerror(memc->cached_errno));\ fprintf(stderr, "\n");} int main() { int seed = time(NULL); memcached_st *memc; memcached_return rc; memcached_server_st *servers; char val[32], key[32]; size_t string_length; uint32_t flags = 0; memc= memcached_create(NULL); servers= memcached_servers_parse("127.0.0.1:11211"); memcached_server_push(memc, servers); memcached_server_list_free(servers); init_gen_rand(seed); for(int i=0;i<100000;++i) { int t = gen_rand32()%10000; sprintf(key, "key:%d", t); if(gen_rand32()%10<3) // write test { sprintf(val,"value:%d",t); rc = memcached_set (memc, key, strlen(key), val, strlen(val),0,0); if (rc == MEMCACHED_SUCCESS) { cout<<"Set "<<val<<" for "<<key<<endl; }else memcached_error(key,memc,rc); }else // read test { char *value = memcached_get(memc, key, strlen(key), &string_length, &flags, &rc); if (rc == MEMCACHED_NOTFOUND) { cout<<"Value for "<<key<<" was not found."<<endl; }else if (rc == MEMCACHED_SUCCESS) { cout<<"Value for key["<<key<<"] was found["<<value<<"]"<<endl; }else memcached_error(key,memc,rc); free(value); } } memcached_free(memc); return(0); }
結果は,完全に予想通りです.
DBの種類 | 処理時間(秒) |
memcached | 14秒 |
Tokyo Tyrant | 21秒 |
楽天ROMA | 32秒 |
シンプルな超高速memcached,ファイルベースで不揮発性にできるTokyo Tyrant,不揮発性かつスケーラビリティに優れる楽天ROMAと,選択肢が増えたことになります.
当然,これらはポートを変えて立ち上げておいて,用途に応じて使い分けるべきでしょう.全部memcachedアスキープロトコル準拠なところが素晴らしいです.
ちなみに,memcachedの立ち上げは,ほぼデフォルトパラメータ,
# memcached -vv -u nobody -p 11211
Tokyo Tyrantはメモリベースじゃない普通のハッシュDB,ま,ポートはmemcachedにそろえて...
# ttserver -port 11211 ttcache.tch
今回はクライアントもサーバも同一マシンで,I/O負荷がボトルネックってのは間違いない(とは言え,2倍も差が出る事実はI/Oが100倍早くなっても引っくり返らないでしょう)ですので,次はマシン(ディスク)を増やしてI/O負荷を軽減させて,今回の3種のDBで試してみたいです.