以前、ここに書いていた、memcachedのincrがスレッドセーフではなく、番号がズレることがある件が 1.4.6 で修正されたようなので検証してみた。

memcached-1.4.6のダウンロードは、memcached.org から
リリースノート http://code.google.com/p/memcached/wiki/ReleaseNotes146

検証に使うscriptは以下。

use Cache::Memcached::Fast;
use Parallel::ForkManager;
my $i=0;
while(1) {
$i++;
my $memcached = Cache::Memcached::Fast->new({
    servers            => [ { address => "localhost:11211", noreply => 0 }  ] ,
    compress_threshold => 4_000,
    ketama_points      => 250,
    max_failures       => 3,
    failure_timeout    => 2,
});
$memcached->set("hoge",1);
print $i;

my $pm =Parallel::ForkManager->new(30);
foreach my $id ( 1..1000 ) {
    $pm->start and next;

    my $childmemcached = Cache::Memcached::Fast->new({
        servers            => [ { address => "localhost:11211", noreply => 0 }  ] ,
        compress_threshold => 4_000,
        ketama_points      => 250,
        max_failures       => 3,
        failure_timeout    => 2,
    });
    for my $loop ( 1..100 ) {
        my $ret = $childmemcached->incr("hoge");
        warn "[$id] failed?" unless $ret;
    }
    $pm->finish;
}
$pm->wait_all_children;

sleep 1;
my $ret = $memcached->get("hoge");
print $ret;
die if $ret != 100001;
sleep 30;
}

まず、memcached-1.4.5に対して実行してみると

$ perl -l mem.pl
1
100001
2
100001
3
100001  
4
100001
5
100001
6
99995
Died at mem.pl line 37.

意外と簡単に、6ループ目で発症。

次に、memcached-1.4.6で検証

$ perl -l mem.pl
1
100001
2
100001
3
...
100
100001
101
100001
...

angry birdsをやりながらしばらく動かしっぱなしにしてたけど、途中で止まったりはしない模様。
ということで、memcached-1.4.6でincr/decrがスレッドセーフではないバグは修正されたと言っても問題ないでしょう

ちなみに、1.4.6では、mixiの障害の原因にもなった接続時の競合も解決されているようなので、要チェックです

このブログ記事について

このページは、Masahiro Naganoが2011年7月22日 15:21に書いたブログ記事です。

ひとつ前のブログ記事は「ディレクターやエンジニアが運用エンジニアにインフラの相談をする際に持って来て欲しい5つのこと」です。

次のブログ記事は「MySQL 4.0 Casual Talks Vol.2 で LT してきました」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ

OpenID対応しています OpenIDについて
Powered by Movable Type 4.27-ja