memcached を監視する

永田です。

まずはこちら。

blog.ingage.jp

よろしくお願いします。

さて弊社ではとあるデータのキャッシュには memcached を使っています。 めちゃくちゃ速いので助かっています。

保存するデータの容量はそんなに多くはなくて、 /etc/conf.d/memcached には、

MEMUSAGE="256"

と 256メガバイトを指定しています。キャッシュを登録する際は期限も設定しているのでだいたいこれで回っていますが、キャッシュするデータ量が256MBを超えることがたまにあります。 この場合、キャッシュの量が上記のように設定したサイズを超えるわけではなく、古いキャッシュが消されていくことになります。

こうなったことは検知しておきたかったので、スクリプトを作ることにしました。 (コマンド呼出し部分とか雑ですが・・・)

#!/usr/bin/env perl

use v5.18;

my $cmd_path = "/usr/bin/memcached-tool";
my @cmd_args = ('localhost', 'stats');

unless (-f $cmd_path) {
    die "$cmd_path not found";
}

my $command = $cmd_path . ' ' . join(' ', @cmd_args);
my $output  = `$command`;

my $limit_maxbytes = 0;
my $bytes = 0;
my $curr_items = 0;
my $evictions  = 0;

for my $line (split("\n", $output)) {
    if ($line =~ /\s+limit_maxbytes\s+(\d+)/) {
        $limit_maxbytes = $1;
    }
    if ($line =~ /\s+bytes\s+(\d+)/) {
        $bytes = $1;
    }
    if ($line =~ /\s+curr_items\s+(\d+)/) {
        $curr_items = $1;
    }
    if ($line =~ /\s+evictions\s+(\d+)/) {
        $evictions = $1;
    }
}
if ($evictions > 0) {
  # ここで通知する
}

いくつかデータはとっていますが、容量がいっぱいになって退去(eviction)させられた古いキャッシュの件数が1以上になったら通知してくれたらいいので evictions のチェックのみをしています。

このスクリプトを定期的に流しており、この通知がきたら、memcached を再起動して様子をみています。 (memcached が空になったら、データベースに一斉にアクセスがいくわけですが、今回のケースはそこまで負荷にはなっていないです)

いくら再起動してもこの通知が来るようになったらメモリの容量が足らないと判断できます。