mrubyでKey-Value Storeにアクセスできるクライアントをこれまでいくつか作ってきたので、VedisやHashの性能が見たいというのと、その他ちょっとした興味でそれぞれのKVSのSET/GETを投げてみて速度の比較をしてみました。
といっても、それぞれの良さを考慮したベンチマークではなくソフトの良し悪しを測るものではないので、この条件だとこういう結果になるという参考程度に見て頂ければと思います。
比較対象は、mrubyのHash、Redis、Vedis(In-Memory)、Vedis(On-Disk)、Memcachedです。それぞれ、Fedora19のyumでインストールした後にserviceコマンドで起動させただけの状態です。マシンはCPUコア2つのメモリ8GBを使いました。
RedisやMemcachedはこのエントリを見ている人は僕以上に詳しいと思うので、Vedisのみについて簡単に紹介しておきます。VedisはRedisのコマンド互換でサーバ機能を持たず、アプリ自身のプロセスで動作するKVSです。In-Memoryで使用した場合はそのプロセス上にデータを保存、On-Diskの場合は指定のファイルにデータを保存します。詳しくは過去のエントリ「mrubyでRedis使うのはオーバースペックな人のためにmruby-vedis作った」をご覧下さい。
ベンチマーク
mrubyで比較ですので、ベンチマーク比較として以下のような簡単なコードを書いて(suzukaze7さんのmruby-msgpackの記事を参考)比較しました。また、クライアントには、
を使っています。
[program lang=’ruby’ escaped=’true’]
class SimpleBenchmark def initialize width = 0 @width = width end def measure label start = Time.now yield if block_given? passed = Time.now - start puts "#{make_fixed_label(label)}passed time #{passed} sec" end def make_fixed_label label if @width - label.length > 0 label + ' ' * (@width - label.length) else label end end end benchmark = SimpleBenchmark.new 12 r = Redis.new "127.0.0.1", 6379 v = Vedis.new d = Vedis.new "/tmp/vedis.db" m = Memcached.new "127.0.0.1:11211" h = Hash.new n = 100000 [r, v, d, m, h].each do ¦kvs¦ benchmark.measure("#{kvs.class}: ") do n.times do ¦t¦ kvs[t.to_s] = t.to_s if kvs[t.to_s] != t.to_s raise "#{kvs.class}: set/get #{t.to_s} failed" end end end end r.close v.close d.close m.close
[/program]
単純に10万回KeyとValueを変えてSET/GETを行っているだけのベンチマークです。実行結果は以下のようになりました。
- 家のVM環境(コア2個メモリ8GB)
[program lang=’bash’ escaped=’true’]
$ ./bin/mruby bench.rb Redis: passed time 5.37813999999999 sec Vedis: passed time 0.16775399999999 sec Vedis: passed time 0.30398399999999 sec Memcached: passed time 3.43488299999999 sec Hash: passed time 2.25670599999999 sec
[/program]
- さくらのVPSコア2メモリ2GBのSSDプラン
[program lang=’bash’ escaped=’true’]
Redis: passed time 19.2161259999999 sec Vedis: passed time 0.42209799999999 sec Vedis: passed time 0.93883899999999 sec Memcached: passed time 17.9307510 sec Hash: passed time 8.13570499999999 sec
[/program]
結果としては、速い順に
- Vedis(In-Memory)
- Vedis(On-Disk)
- Hash
- Memcachd
- Redis
となりました。
結果出力の3行目のVedisはOn-Diskタイプになります。現状ではホ~という感じですが、アプリで外部にKVSをもつ必要がない場合などにVedisは非常に高速なので使いやすそうという印象は受けました。また、RedisやMemcachedの設定を変えるとまた違った結果になるのだろうと思います。さらには、通常のHashよりもVedisの方がこの条件で性能が出たというのは意外でした。
ということで、今回はVedisの性能も含めて大体の速度の雰囲気を掴みたかったのでこのような簡単なベンチマークを試してみました。Vedisはあまり馴染みのないソフトウェアだと思うので、これを機に幾つか試してみると面白いだろうなぁと感じました。