memcacheの速度比較
python_memcachedよりもpylibmc(libmemcachedのpythonバインディング)のほうが速いらしいので試してみた。
環境
CentOS6.0
memcached-1.4.10
libmemcached-1.0.2-1.el6
python_memcached-1.47
pylibmc-0.2.1
結果
get,set,deleteと、それぞれのmultiについて10000回処理するのにどのくらい掛かるか測ってみた。
試行回数:10000 ------------------------------------------------------ - memcache ------------------------------------------------------ simple set : 3.656920 multi set : 0.303164 simple get : 3.608972 multi get : 0.327255 simple del : 3.397653 multi del : 0.247681 ------------------------------------------------------ - pylibmc ------------------------------------------------------ simple set : 3.035285 multi set : 2.977491 simple get : 3.040355 multi get : 0.036777 simple del : 3.049420 multi del : 2.944354
set_multi、delete_multiは圧倒的に遅いけど他はpylibmcのほうが速い。
特にget_multiに関しては10倍近く速いという結果になった。
使っているget、set、deleteの比率を見てどっち使うか決めるって感じかなぁ。
検証に使用したソースは↓
import datetime import memcache import pylibmc TEST_NUM = 10000 SERVERS = ['0.0.0.0:11211','0.0.0.0:11211'] def getDiff(start): delta = datetime.datetime.now() - start return '%6f' % (delta.seconds + delta.microseconds / 1000000.0) def do_test(client): memcache_key_base = 'testaaaaa:aae:aa:%s' # set. # -simple. start = datetime.datetime.now() for i in xrange(TEST_NUM): client.set(memcache_key_base % i, i) print 'simple set : %s' % getDiff(start) # multi. start = datetime.datetime.now() params = {} for i in xrange(TEST_NUM): params[memcache_key_base % i] = i client.set_multi(params) print 'multi set : %s' % getDiff(start) # get. # -simple. start = datetime.datetime.now() for i in xrange(TEST_NUM): client.get(memcache_key_base % i) print 'simple get : %s' % getDiff(start) # multi. start = datetime.datetime.now() client.get_multi([memcache_key_base % i for i in xrange(TEST_NUM)]) print 'multi get : %s' % getDiff(start) # delete. # -simple. start = datetime.datetime.now() for i in xrange(TEST_NUM): client.delete(memcache_key_base % i) print 'simple del : %s' % getDiff(start) # multi. start = datetime.datetime.now() client.delete_multi([memcache_key_base % i for i in xrange(TEST_NUM)]) print 'multi del : %s' % getDiff(start) print u'試行回数:%s' % TEST_NUM print u'------------------------------------------------------' print u'- memcache test' print u'------------------------------------------------------' do_test(memcache.Client(SERVERS)) print u'------------------------------------------------------' print u'- pylibmc test' print u'------------------------------------------------------' do_test(pylibmc.Client(SERVERS))
あとこれは余談だけどlibmemcachedをwindowsPCで使うのがかなり面倒だった。
さらにpylibmcを使うようにして負荷を掛けてみた(同時10で100request)ら500が返ってくるようになって、解決法が分からなかった。エラーログにはkeyのインクリメントに失敗しているような事が書かれてた。
なんだろう。