わーくあうと!

日々の作業でためになったことをアウトプットすることで自分の成長につながればなと。

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のインクリメントに失敗しているような事が書かれてた。
なんだろう。