楽天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の種類処理時間(秒)
memcached14秒
Tokyo Tyrant21秒
楽天ROMA32秒

シンプルな超高速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で試してみたいです.