« Re: PoCo::Client::HTTP が勝手に文字コードを変えてしまう件 | メイン | Cache::Adaptive の使い方 »

2007年05月09日

負荷に応じてキャッシュを自動調節する Perl モジュール

Cache::Adaptive の使い方に続く

 最近かりかりとサーバサイドの実装をしています。修行の成果、だいぶ複雑な SQL も書けるようになってきました。DBMS の気持ちを考えながら SQL 最適化するのは楽しいですね。しかし、いくら SQL を工夫したところでパフォーマンスの限界はあるわけです。

 となると、採りうる選択肢はスケールアウト・スケールアップ・キャッシングの3つになります (もちろん組み合わせも可)。ただ、需要予測の最大値に基づいて機材を確保するのもあまり効率的とは言えませんし、リリース直後に徹夜でパフォーマンスのチューニングをするのもイヤです。というわけで、負荷に応じてキャッシュを自動調節するような仕組みがないのかなぁと思っていたのですが、見つからなかったので書いてみました。

ダウンロード: Cache-Adaptive.pm

 詳細は POD を書いて疲れたのでそちらを読んでください。以下は使い方の例。こんなことができます。

use Cache::Adaptive;
use Cache::SizeAwareFileCache;

my $cache = Cache::Adaptive->new({
    backend     => Cache::SizeAwareFileCache->new({
        namespace => 'html_cache',
        max_size  => 10 * 1024 * 1024,
    }),
    expires_min => 3,     # キャッシュ時間:  3秒以上
    expires_max => 60,    #                 60秒以下
    check_load  => sub {  # 生成に1秒以上かかかったらキャッシュ強化
        int(shift->{process_time} * 2) - 1;
    },
});

(中略)

print "Content-Type: text/html\n\n";
print $cache->access({
    key     => $uri,
    builder => sub {
        # HTML を生成して返す
        $html;
    },
});

 この例では、エントリの生成時間に応じてキャッシュする期間を調節していますが、コールバックの定義の仕方次第で、

  • よくアクセスされるエントリを自動的にキャッシュしたり
  • load average に応じてキャッシュ量を調節したり
といったことも可能です (POD 参照)。

 まあこんな感じでやれば、新サービスをリリースした日もゆっくり寝ていられるかとか期待しているわけですが (無理だよ)、なにぶん実績のないモジュールです。なので、誰か人柱になってくれないかとブログで公開することにした次第です。興味がある方がいらっしゃれば、CPAN にもアップロードしようと思います。

 あるいは、もっと良い車輪の紹介でもかまいません。よろしくお願いします。

投稿者 kazuho : 2007年05月09日 17:07 このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

トラックバック

このエントリーのトラックバックURL:
http://labs.cybozu.co.jp/cgi-bin/mt-admin/mt-tbp.cgi/1257