RDBMSよりも簡単に扱えるkey-valueストアが最近(?)人気です。
memcachedはメモリ上にデータを保存するため非常に高速だというメリットがありますが、終了するとデータは消えてしまいます。最近ではmixiの障害でも話題に上りましたね。一方Tokyo Cabinetはディスク上にデータを保存するため、終了してもデータは消えません。しかもものすごく速いというのです。

そこでmemcachedとTokyo Cabinetのベンチマークをしてみました。



測定条件
CPU Xeon X3350 2.66GHz 1コア相当 メモリ1GB CentOS 5.5
サーバーとクライアントは別VM(同一ホスト内)
ストレージ:iSCSI RAID 6
ベンチマークプログラムはmcb
memcachedの設定:キャッシュサイズ 750MB
Tokyo Cabinetの設定:バケット数 4000000


ベンチマークの結果、memcachedは秒間2万クエリ(クエリって言い方が適当かはあれですが…)という凄まじいパフォーマンスを見せてくれました。

そして注目すべきはTokyo Cabinetの結果です。memcachedよりは劣るものの、秒間1万クエリほどをさばいています。ディスク上にデータを保存しながらこれだけのパフォーマンスが得られるのってすごいですよね。

ただしvmstatで見るとSET(書き込み)のときのディスクアクセスの量は凄まじいものでした。GET(読み込み)のときはディスクキャッシュが効いているので、ストレージへのアクセスはほとんどありませんでした。チューニングをしてあげればもっと結果は変わってくるでしょう。

これらの結果から、
memcached:とくかく高速さが求められる一時的なキャッシュデータ
Tokyo Cabinet:高速さが求められる永続的に保存したいデータ
RDBMS:確実に保存されていなければならないクリティカルなデータ
という使い分けをしていくとより効率的な使い方ができると思います。

参考:mcbを実行するスクリプト
#!/bin/sh
MODE=$1
LOOP=$2
CONN=$3
PORT=11211 ←Tokyo Cabinetでは1978
HOST='172.16.xx.xxx'

./mcb -c $MODE -a $HOST -p $PORT -t $CONN -n $LOOP -m $LOOP -l 800 > log.tmp
cnt=`grep performance log.tmp|awk '{print $3}'|sed s/"\..*"/""/`
echo $MODE,$LOOP,$CONN,$cnt | tee -a result.csv
rm log.tmp