かなり乗り遅れちゃってるんですが、いまさらならがmemcachedを導入してみました。実績を見るとはてなや、mixiなどの結構大規模なウェブサイトにも導入されているようなのでそこそこのスケーラビリティはありそうです*1。
memcachedというのはその名のとおりメモリを使ったキャッシュサーバーで、ディスクへの書き込み機能を持たず、テーブルが1つしかないDBのようなものです。データはメモリ上にしか保存されないので、高速に動作しますが、デーモン自体を再起動すると保存していたデータは消去されてしまいます。大概のウェブアプリケーションにおけるトランザクションは更新系よりも参照系の方が圧倒的に多いので、ライトスルーキャッシュのような使い方でも十分に性能の向上が見込めると思います*2。
† memcached以前
これまでPHPのメモリキャッシュにはXCacheやeAcceleratorの機能を使っていたんですが、これらはmod_phpに組み込まれて動くものなのでウェブサーバーを再起動するたびにキャッシュが空になってしまうのが非常に気になっていましたが、こちらはキャッシュデーモンを再起動しない限りキャッシュは常に温まっている状態(warm cache)にあるので心置きなくApacheの再起動ができるようになります。
† 導入方法
導入は簡単で、ほとんど設定の必要ありません。
またデーモンの設定はすべてコマンドラインオプションで行います。
1.libeventのインストール
2. memcachedのインストール
3. memcachedの起動
4. phpへのモジュール組み込み
peclでのインストール後、memcache.soをextensionとして読み込むようにphp.iniを編集
5. phpからの接続テスト
Apacheを再起動後、下記の内容のファイルを作って起動してみる。エラーが表示されなければOK。
† 導入後
さっそくNucleusのコア*3にちょっと手を入れてみたいのですがいい感じで動いています。
時間がないのでちゃんとしたベンチを取っていないのですが、通信のオーバーヘッドが若干あるためなのかXCacheやeAcceleratorよりは数十ミリ秒ほど遅くなっているようですがぜんぜん許容範囲内です。
† 運用の工夫
cactiを使ってmemcachedの稼動統計を取ってみました。
→cactiでmemcachedを監視する
→続・cactiでmemcachedを監視する
PHPで動く、memcachedの内容をダンプするスクリプトを書いてみました。
→memcachedの内容を確認するには
このエントリへのTrackbackにはこのURLが必要です→https://blog.cles.jp/item/1767
コメントは承認後の表示となります。
OpenIDでログインすると、即時に公開されます。
OpenID を使ってログインすることができます。