KyotoTycoon + KyotoCabinetのベンチマーク

KyotoTycoonが以前からすごく気になっていたのですが、
次の開発で導入すべく動作検証してみました。

まずは、KyotoTycoon + KyotoCabinet の気になるところを紹介すると。

  • DBがキャッシュ、B+ツリー、ハッシュなど選べる
  • ホットバックアップ
  • 非同期レプリケーション
  • デュアルマスタ
  • スナップショット これいいかも。lzo圧縮も効く。リカバリー用にも使える。
  • プラグインmemcachedプロトコルが使える
  • lua拡張も使えるので、やろうと思えばなんでもあり。
  • noreplyを使うと何倍も速くなるらしい。
  • writebackで書き込むと何倍も速くなるらしい。

ブログがとても参考になります。
http://fallabs.com/blog-ja/promenade.cgi

テスト環境(DELL PowerEdge R200改)

CPU Intel Xeon CPU X3360 2.83GHz (4core)
メモリ 8GB
HDD 1TB (Hitachi HDT721010SLA360)
OS CentOS 6.0 (2.6.32-71.29.1.el6.x86_64)

KyotoCabinetインストール

yum install lzo-devel lzma-devel xz-devel
cd /usr/local/src
wget http://fallabs.com/kyotocabinet/pkg/kyotocabinet-1.2.70.tar.gz
tar zxfv kyotocabinet-1.2.70.tar.gz
cd kyotocabinet-1.2.70
./configure --prefix=/usr/local/kyotocabinet --enable-lzo --enable-lzma
make
make install
echo /usr/local/kyotocabinet/lib > /etc/ld.so.conf.d/kyotocabinet.conf
ldconfig

KyotoTycoonインストール

yum install lua-devel.x86_64
cd /usr/local/src
wget http://fallabs.com/kyototycoon/pkg/kyototycoon-0.9.51.tar.gz
tar zxfv kyototycoon-0.9.51.tar.gz
cd kyototycoon-0.9.51
./configure --prefix=/usr/local/kyototycoon --with-kc=/usr/local/kyotocabinet --enable-lua
make
make install
echo /usr/local/kyototycoon/lib > /etc/ld.so.conf.d/kyototycoon.conf
ldconfig

ktserver起動オプション

ktserver \
-port 11311 \
-tout 10 \
-th 16 \
-log /var/kt/log/ktserver.log -ls \
-ulog /var/kt/log/ulog -ulim 256m \
-sid 1 \
-bgs /var/kt/snapshot -bgsi 180 -bgsc lzo \
-pid /var/kt/log/kt.pid \
-cmd /var/kt/bin \
-plsv /usr/local/kyototycoon/libexec/ktplugservmemc.so \
-plex "port=11312#opts=f#tout=10" \
"/var/kt/db/casket.kch#opts=l#bnum=20000000#msiz=8g#dfunit=8"

性能評価は、使い慣れたPerlではなくあえてPHP
daemontoolsでktserverを起動し、次のバッチを実行した。
PHPソースコード


<?php
$data = array(
'name' => 'testname',
'testdata' =>
array(1,2,3,4,5,6,7,8,9,0,'abcdefghijklmnopqrstuvwxyz',
'userid' => 'testuserid',
'entry' => '2011-10-20 12:00:00'
)
);
$mem = new Memcached();
$mem->addServer('localhost',11312);
for ($i = 0; $i < 10000000; $i++) {
$guid = md5(uniqid(mt_rand(),true));
$guid = substr($guid,0,21);
$mem->set($guid, $data);
}
pecl memcached 2.0.0b2 (libmemcached 0.53)を使用。
perlならCache::Memcached::Fastで試しますね。

ベンチマーク結果

  • setの結果(1000万件登録)
使用メモリ 2.0g
ファイルサイズ 2.0g
スナップショット 227M
性能 12300qps
  • getの結果
性能 15000qps

バッチ実行時はloadavgは常時1以下でかなり快適です。
チューニングの余地があるんでしょうが、
本番環境では常に負荷が低い方がよいこともあり、このままでも十分かも。
また、スナップショットのファイルサイズに感動ですね。
バックアップとか助かります。