読者です 読者をやめる 読者になる 読者になる

pylibmc追試

Python

pylibmcはlibmemcachedのPythonバインディング。同様のライブラリにpython-libmemcached(cmemcached)があるが、cmemcachedがPyrexを使って書かれているのに対して、libmcの方は手書きのCのコードによる拡張である。

作者によるベンチマークではcmemcachedよりも速いとこのこと。

pylibmcの配布物にはこのベンチマークに使ったと思われるスクリプトが含まれているので、追試を行ってみた。環境は、CentOS 5.3, Python 2.5.4, memcached 1.2.6, libmemcached 0.27。python-memcahced, python-libmemcached, pylibmcはそれぞれ最新版。

Testing memcache
================
simple_set: avg: 2304.77 calls/sec  (433.88 microsec/call)
            med: 3334.10 calls/sec  (299.93 microsec/call)
multi_set: avg: 1372.78 calls/sec  (728.45 microsec/call)
           med: 1729.97 calls/sec  (578.05 microsec/call)
simple_get: avg: 2348.10 calls/sec  (425.88 microsec/call)
            med: 3266.59 calls/sec  (306.13 microsec/call)
multi_get: avg: 1410.73 calls/sec  (708.85 microsec/call)
           med: 1818.08 calls/sec  (550.03 microsec/call)
simple_delete: avg: 1224.77 calls/sec  (816.48 microsec/call)
               med: 1538.07 calls/sec  (650.17 microsec/call)
multi_delete: avg: 713.76 calls/sec  (1401.02 microsec/call)
              med: 1000.07 calls/sec  (999.93 microsec/call)

Testing cmemcached
==================
simple_set: avg: 1661.83 calls/sec  (601.75 microsec/call)
            med: 1479.47 calls/sec  (675.92 microsec/call)
multi_set: avg: 758.31 calls/sec  (1318.72 microsec/call)
           med: 1000.07 calls/sec  (999.93 microsec/call)
simple_get: avg: 3214.41 calls/sec  (311.10 microsec/call)
            med: 4485.89 calls/sec  (222.92 microsec/call)
multi_get: avg: 3056.01 calls/sec  (327.22 microsec/call)
           med: 6492.73 calls/sec  (154.02 microsec/call)
simple_delete: avg: 1642.52 calls/sec  (608.82 microsec/call)
               med: 2109.81 calls/sec  (473.98 microsec/call)
multi_delete: avg: 557.99 calls/sec  (1792.15 microsec/call)
              med: 706.23 calls/sec  (1415.97 microsec/call)

Testing pylibmc
===============
simple_set: avg: 3256.40 calls/sec  (307.09 microsec/call)
            med: 7626.01 calls/sec  (131.13 microsec/call)
multi_set: avg: 1172.33 calls/sec  (853.00 microsec/call)
           med: 1377.44 calls/sec  (725.98 microsec/call)
simple_get: avg: 3696.82 calls/sec  (270.50 microsec/call)
            med: 4854.52 calls/sec  (205.99 microsec/call)
multi_get: avg: 3146.72 calls/sec  (317.79 microsec/call)
           med: 4424.37 calls/sec  (226.02 microsec/call)
simple_delete: avg: 1845.87 calls/sec  (541.75 microsec/call)
               med: 2283.24 calls/sec  (437.97 microsec/call)
multi_delete: avg: 588.91 calls/sec  (1698.06 microsec/call)
              med: 744.60 calls/sec  (1343.01 microsec/call)

結論だけ書くとpylibmcが速いのは間違いなさそうだったが、Ludvig Ericson氏のブログにあるベンチマーク結果のようなpylibmc>cmemcached>memcachedのような結論は出せなかった。むしろ、Pure Python版のmemcachedの健闘の方が印象に残る。この点に関しては他の方による追試を希望。

Djangoがcmemcachedを採用していたり、"python libmemcached"みたいなクエリで検索するとpython-libmemcachedの方が上位に出てきたりするので、python-libmemcachedの方が知られているのかと思うが、個人的にはpylibmcの方を押す。pylibmcの方がmemcachedのプロトコルの実装度が高く、コードもきちんとしている気がする。python-libmemcachedは、なんというか、エラー時の処理が「甘い」。

とはいえ、memcached, cmemcached, pylibmcのどれもget, set, delete以外のコマンドの振る舞いが違ったりして、「Pythonにはまともなmemcachedのクライアントはねーな。(お前ら、get, set, delete以外使っていないだろ。全俺が泣いた。)」というのが率直なところなのだけれども。