プロダクトもいろいろあるが、memcachedの本家が作っており導入が簡単なmembaseを試してみた。
ネットワーク越しだと割り切ればそれなりだ。
比較用の環境
クライアント×1
memcachedサーバ×1
membaseサーバ×2(クラスタ)
クライアントからmemcachedとmembaseにそれぞれアクセス。
動作テスト兼速度比較のシーケンス
この用に動作させて、データの整合性をチェックしつつ回す。
- membaseAにsetする
 - setした値をmembaseBからgetする
 - setした元値とgetした値を比較する
 - membaseAからdeleteする
 - deleteしたはずのキーをmembaseBからgetする
 - getできたらだめ
 
というシーケンス、1週当たりmemcacheアクセスは4回。
比較の結果
それぞれ10000回をまわしてみて時間をとった。
memcached(TCPでリモート)
# time bundle exec ruby ./memcached-cli2.rb 10000
real    1m23.989s
user    0m10.330s
sys     0m2.840sネットをまたぐとそれなりに時間がかかる、1分半。
membase(TCPでリモート)
# time bundle exec ruby ./memcached-cli.rb 10000
real    1m45.161s
user    0m10.290s
sys     0m2.680s20秒くらいの差。
40000クエリで20秒差が発生と考えると、 1クエリあたり0.5ms程度の性能差があるのかね。
参考:ローカル動作memcachedの結果
参考までにローカルのmemcachedに向けて同じテストをしてみた。
# time bundle exec ruby ./memcached-cli2.rb 10000
real    0m5.096s
user    0m3.070s
sys     0m0.950s同じ処理だと5秒でおわる、だいぶ差はあるね。
そもそもネットワーク越しのmemcached自体がmongodbより遅かったりと微妙な所は多い。
まとめ
単純にmemcache互換でクラスタしたかったら構築の楽なmembaseもあり。すでにネット越しでmemcachedを共有しているなら特に。
データの永続化を考慮するとkumofsとかokuyamaをちゃんと検討すべきで、ローカルmemcachedの速度を求めるなら設計とかから見直すほうがいいかもね。

0 件のコメント:
コメントを投稿