Ethna CacheManager 比較
Ethnaにはデータキャッシュ用のプラグインがあります。効率よく使うとパフォーマンスを劇的に改善してくれるアレです。
がありますが、今までずっとEthna_Plugin_Cachemanager_Localfileばっかり使っていたので、memcachedを使うとどんだけ早いんだろー?と以前からワクワクしてたので、Ethna_Plugin_Cachemanager_Memcacheを使ってみました。
ちなみに、set時でなくget時にライフタイム指定ができるあたりが結構気に入ってます。
memcachedを入れてみる
面倒だから今回はrpmで突っ込んでみる。
# wget http://dag.wieers.com/rpm/packages/libevent/libevent-1.3b-1.el4.rf.i386.rpm # wget http://dag.wieers.com/rpm/packages/memcached/memcached-1.2.1-3.el4.rf.i386.rpm
localfileのyumインストールでGPGKEYのチェックで怒られたので/etc/yum.confでgpgcheckを外しておく。(終わったら戻しておく)
gpgcheck=0
インストール
# yum localinstall libevent-1.3b-1.el4.rf.i386.rpm # yum localinstall memcached-1.2.1-3.el4.rf.i386.rpm
PECLのmemcacheをインストール
# pecl install memcache
あとはphp.iniに
extension=memcache.so
を追加すればOK。これで使えるようになった。
Ethna上で設定
BASE/etc/appid-ini.phpの下のほう
'memcache_host' => 'localhost', 'memcache_port' => 11211, 'memcache_use_connect' => false, 'memcache_retry' => 3, 'memcache_timeout' => 3,
etcのサンプルの記述を見るに、namespace毎に複数のmemcacheサーバを指定できるみたい。今回はlocalhost1台のみ。
てか、Ethna_Plugin_Cachemanager_Memcacheのソースを見てたら、localhost:11211なら書かなくても繋いでくれるみたい。
LocalfileとMemcacheで比較
検証のためアクションにベタ書き。
意味は無いけどガンガンキャッシュにアクセス。
require_once('Benchmark/Timer.php'); class Appid_Action_Memcache extends Ethnalab_ActionClass { function perform() { $type = 'Memcache'; // or 'Localfile' $key_skel = 'foobar_%03d'; $namespace = 'foo'; $lifetime = 1000; $cm =& $this->backend->plugin->getPlugin('Cachemanager', $type); $bm =& new Benchmark_Timer(); $bm->start(); for ($i = 0; $i < 10; $i++) { for ($j = 0; $j < 1000; $j++) { $key = sprintf($key_skel, $j); $r = $cm->get($key, $lifetime, $namespace); if (Ethna::isError($r)) { $cm->set($key, $j, null, $namespace); } } } $bm->stop(); $bm->display(); exit; } }
結果 lifetime 1000
- Memcache
- 6.0970849990845
- 6.269326210022
- 6.3600161075592
- Localfile
- 5.1359589099884
- 5.2926080226898
- 5.2810370922089
アレ!?Localfileの方が早いよ!
キャッシュが頻繁に更新されたら違うかもしれない。$lifetimeを1に。
結果 lifetime 1
- Memcache
- 16.544981956482
- 8.3540189266205
- 7.2866940498352
- Localfile
- 10.868150949478
- 10.440382957458
- 9.8940320014954
なんだかMemcacheは結果が安定しない。この後何回やってもバラつきは変わらず。
1プロセスで検証しても意味無いかと思って、複数コネクション張ってみたり、保存するデータをもう少しボリュームあるものに変更してみても結果に大差はなかった。
結果的にこれは、「やるじゃん!Localfile!」なのか「どうした!?Memcache!」なのかわかんない。