memcached。
…で、何故に Cache::Memcached のコードを読んでたか?っちゅーと
内部でどうやって、memcached にアクセスしてるんかなー?と
軽く見ておきたかったからなのですが。
結局、sock_to_host で普通に socket 繋いでて、
やっぱりなー…というか、それ以外方法はないだろーけど…と思いつつ、
キャッシュしたい値は安易に memcached に突っ込むべきではないだろーなぁ…と
確信した次第。
そげなこったで、パッケージ変数のハッシュをキャッシュとして使う場合、
保存するデータ量が増えれば増える程、メモリ使用量も当然増えるので
それはそれで慎重に導入すべきだけど、
memcached を導入する場合と比較して、どれくらい高速で
何回参照するんなら、memcached のが有利になるんだろー?と
軽くベンチとって見ることに。
さてと、ほんじゃ、memcached からインストールしますかって
ここを参考にして作業。
すると、memcached 起動時に文句を言われる。
[http@localhost memcache]# memcached -d -m 128 -l 127.0.0.1 -p 11211memcached: error while loading shared libraries: libevent-1.1a.so.1: cannot open shared object file: No such file or directory
あらー、何処に libevent-1.1a.so.1 インストールされたんだっけ?と思ったら
/usr/local/lib/libevent-1.1a.so.1 に入ってたので、
シンボリックリンクを作ってみる。
[root@localhost memcache]# cd /usr/lib
[root@localhost lib]# ln -s /usr/local/lib/libevent-1.1a.so.1 libevent-1.1a.so.1
すると、今度は起動できたので、netstat でも確認。
[root@localhost memcache]# netstat -tap | grep memcachedtcp 0 0 localhost.localdomain:11211 *:* LISTEN 25370/memcached
よし、ほんじゃ、ベンチ取るよー。
・test.pl
#!/usr/bin/perl -w値を入れるところで、普通だったらSQL発行してuse strict;
use Cache::Memcached;
use Benchmark qw(:all);
my $loopCount = 100;
my $result = timethese(1000, {
'mem' => sub {
my $memd = new Cache::Memcached {
'servers' => [ "localhost:11211" ],
'debug' => 0
};
my $targetKey = 'test';
$memd->delete($targetKey);
for (1..$loopCount) {
&_getTest($memd, $targetKey);
}
},
'normal' => sub {
my %cache = ();
my $targetKey = 'test';
for (1..$loopCount) {
&_getTestNormal($targetKey, \%cache);
}
}
});
cmpthese($result);
exit;
sub _getTestNormal($\%) {
my $name = shift;
my $refCache = shift;
return $refCache->{$name} if defined $refCache->{$name};
my $value = 'TEST';
$refCache->{$name} = $value;
return $value;
}
sub _getTest($$) {
my $memd = shift;
my $name = shift;
my $value = $memd->get($name);
return $value if defined $value;
$value = 'TEST';
$memd->set($name, $value);
return $value;
}
# enf of this script
DBからデータ持ってきたりするんだけど、ここでは文字列を入れるだけにしちゃいました。
さて、結果はどうでしょう?
[anigon@localhost memcache]$ ./test.pl・・・・・うーむ。Benchmark: timing 1000 iterations of mem, normal...
mem: 477 wallclock secs (122.49 usr + 155.77 sys = 278.26 CPU) @ 3.59/s (n=1000)
normal: 1 wallclock secs ( 0.20 usr + 0.00 sys = 0.20 CPU) @ 5000.00/s (n=1000)
(warning: too few iterations for a reliable count)
Rate mem normal
mem 3.59/s -- -100%
normal 5000/s 139030% --
じゃあ、メモリのくい方とか見てみますかー。
#!/usr/bin/perl -wで、この結果。use strict;
use Cache::Memcached;
use Benchmark qw(:all);
use Devel::MemUsed;
my $memused = Devel::MemUsed->new;
my $loopCount = 100;
my $result = timethese(100, {
'mem' => sub {
$memused->reset();
my $memd = new Cache::Memcached {
'servers' => [ "localhost:11211" ],
'debug' => 0
};
my $targetKey = 'test';
$memd->delete($targetKey);
for (1..$loopCount) {
&_getTest($memd, $targetKey);
}
print 'memcached: '.$memused->used(), "\n";
},
'normal' => sub {
$memused->reset();
my %cache = ();
my $targetKey = 'test';
for (1..$loopCount) {
&_getTestNormal($targetKey, \%cache);
}
print 'normal: '.$memused->used(), "\n";
}
});
cmpthese($result);
exit;
# 以下、サブルーチン達に変更はなし
[anigon@localhost memcache]$ ./test.plえーっと、なんか memcached に恨みでもあるのか?と言わんばかりにBenchmark: timing 100 iterations of mem, normal...
memcached: 56896
memcached: 368
memcached: 368
memcached: 368
(略)
normal: 40
normal: 40
normal: 40
normal: 1 wallclock secs ( 0.12 usr + 0.07 sys = 0.19 CPU) @ 526.32/s (n=100)
(warning: too few iterations for a reliable count)
Rate mem normal
mem 3.66/s -- -99%
normal 526/s 14268% --
memcached に不利な結果を生み出してますね。
ちゃんとキャッシュ化した方が良いデータで
ベンチ取ってみるべきでしたね。。。ごめん、memcached ちゃん。