frei

旧「anney's room」からブログ「frei」だけ引っ越し&残しました

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 11211

memcached: 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 memcached

tcp 0 0 localhost.localdomain:11211 *:* LISTEN 25370/memcached

よし、ほんじゃ、ベンチ取るよー。

・test.pl

#!/usr/bin/perl -w

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

値を入れるところで、普通だったらSQL発行して

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

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 に不利な結果を生み出してますね。

ちゃんとキャッシュ化した方が良いデータで

ベンチ取ってみるべきでしたね。。。ごめん、memcached ちゃん。