Ethna CacheManager 比較

Ethnaにはデータキャッシュ用のプラグインがあります。効率よく使うとパフォーマンスを劇的に改善してくれるアレです。

  • Ethna_Plugin_Cachemanager_Memcache
  • Ethna_Plugin_Cachemanager_Localfile

がありますが、今までずっと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!」なのかわかんない。

まとめ

まあ、memcachedは入れたままデフォな状態だし、(設定とかでなんとかなるのか?)キャッシュで大事なのはキャッシュ自体のスピードっていうよりは、キャッシュすることなわけなので別にいいのかも。

サーバが複数台あるような環境で考えるとmemcachedを使う利点ってのがいっぱいわかるけど、1台のサーバで使う程度の規模で単純なデータのキャッシュ程度なら無理してmemcachedを入れなくても、ファイルキャッシュで無問題なのかなぁと思った。