memcached で新しくキャッシュを保存出来ない?! - にぽたん研究所

May 01, 2006

このエントリーをはてなブックマークに追加
そう言えば、今日、
memcachedで新しくキャッシュを保存できないの刑
を読んで愕然とした。
なんか、キャッシュやセッションでmemcachedをつかっているのだけど、環境によって新しくキャッシュがつくれなくなってしまって、はまった。

規模から考えると極端に使用メモリサイズが少ない設定になっているサーバがあったので、ちょっと使用領域増やして再起動の術をしてみたら、とりあえず直った。

ドキュメント読むのがおっくうなので、ローカルな環境でためしてみたら、memcachedでのキャッシュは -m で設定したサイズになっちゃうと、新しく作れなくなっちゃう感じ。
えぇっ!!マジっすかぁ?!
一杯になったときは、古い順から消えていくと勝手に思っていた。。
いや、まったくその通りだと思ってました…。

ってことで、どうも疑い深い性格なので、手元の Darwin 環境で試してみた。

% memcached -m 1 -p 12345 &
こんなんして、1MB しかキャッシュしないようにして memcached を起動んぬ。
use strict;
use Cache::Memcached;

my $cache = Cache::Memcached->new({
    servers => ['localhost:12345'],
    debug   => 0,
});

# XXX get immediately after storing
for my $key (0 .. 9) {
    $cache->set($key => '.' x 200_000);
    my $stored = $cache->get($key);
    print "$key :", length($stored), "\n";
}

sleep 1;

# XXX get stored
for my $key (0 .. 9) {
    my $stored = $cache->get($key);
    print "$key :", length($stored), "\n";
}
こんなん動かしてみるとわかりますけど、とりあえず、set() した直後に get() してみると、必ず値はセットされていて、過去に set() したものを後で get() してみると、古いものから順次削除されていることがわかります。

ただ、最初から memcached の -m オプションの値を超えるデータ量を 1 度の set() で突っ込もうとするとどうやらまったく保存してくれないっぽいです。

なので、とりあえず -m オプションの値云々には注意しなくてはいけないにしろ、
一杯になったときは、古い順から消えていくと勝手に思っていた。。
については、そう思ってて大丈夫っぽいですよ。>きむらさん

ちなみに、弊社の某案件あたりでは、expires 未設定の cache は作らないようにしてたりします。


Update:
のみまくし日記 - 続・memcachedで新しくキャッシュを保存できないの刑
に続編が出てましたが、ここに書かれたテストコードを実行すると、値がセット出来ない問題は確かに再現します。
うーむ。
これは何なんでしょうかねぇ。

あと、
subtech グループ - Bulknews::Subtech - memcached
memcached はストアするオブジェクトのサイズごとに異なるLRUキャッシュ(クラス)を保持する。また、あるクラスのデータをいれようとしたときにすでにメモリが埋まっていると、Out of Memory エラーとなる。

よってmemcachedデーモン起動時に、格納する可能性のあるサイズ(1k, 2k, 4k, 8k...) ごとにダミーのデータをいれて確保しておくのがベストプラクティス。

ということだけど、1年以上前の話だから memcached サーバ側ですでに対策が入っているかも。ご利用は自己責任で。
という情報もあったので、メモメモ。

nipotan at 17:41 | Comments(2) | TrackBack(1) | 技術 
このエントリーをはてなブックマークに追加

Trackback URL for this entry

Trackbacks

1. 続・memcachedで新しくキャッシュを保存できないの刑  [ のみまくし日記 ]   May 01, 2006 20:15
古い順から消えないってのは勘違いでした。んでは、保存されなくなっちゃったのはなんだったんかなーと思ってちょっと検証してみました。

Comments

1. Posted by    May 02, 2006 00:14
すでにsquidは忘れられてしまったのだろうか?細かい設定ならそちらの方がぐーなのだが....
2. Posted by nipotan   May 02, 2006 14:49
あ、いや、web の cache は、所々 squid 使ってたりします。
memcached は別の用途の cache です。
YAPC::Asia でも時々話題に出てたアレです。

Post a comment

Name:
URL:
  Remember info?: Rate: Face    Star