ブログ / CMS サーバ WordPress の動作が重くなってきたので、キャッシュプラグイン wp-cache の導入に踏み切りました。そもそもキャッシュとは何か、wp-cache のパフォーマンス測定について。

WordPress: wp-cache キャッシュありとなしの比較

Web ページ生成に 10秒はかかりすぎ

Movable Type (以下 MT) ではなく WordPress でコンテンツを管理するようになって、サクサク記事が書きやすくなったのはよいのですが、記事数の増加と、プラグインの数が増え (現在 23個だったりする) 処理が複雑になってくるにつれて、どんどん重くなってきました。

一般に Web ブラウザからある URL にリクエストを出して、ページのコンテンツをレンダリングし終わるまで、ユーザーが待てる時間は 6秒と言われています。

www.nire.com はどうか。気がついたら、ある記事へのリンクをクリックして、「1, 2, 3…」 10秒とかかかることもザラです。 :mrgreen: いくら個人ブログとはいえ、サービスレベルやばいでしょう、ということで Nire.Com 高速化計画、発動なわけです。

キャッシュ = 一時コピー置き場

既存コンテンツのレイアウトを変えたり、常時使用中のプラグイン減らしたり、記事減らしたり、といった、見た目に影響する部分は最後の手段と考えているので、まずは仕方なくキャッシュを入れてみます。

キャッシュ (cache) とは。インターネットやコンピュータ技術の至る所で使われていますが、共通して言えるのは、一回読んだデータや、作成した結果を置いておく一時的なコピー置き場です。1

Squid の話を書きましたが、あれもキャッシュサーバの一種です。一度ネット的に遠い2 サーバに時間をかけて取りに行ったデータのコピーを、一時的に proxy サーバ上に置いておき、同じ URL にアクセスしようとしたクライアントには、コピーの方を見せることで、見かけの動作を高速化します。(forward proxy)

1度作った HTML コンテンツをキャッシュする wp-cache

WordPress プラグイン wp-cache

WordPress の場合は、一番多く使われているのは wp-cache というプラグインです。

初回 Web クライアントから何かのページをリクエストされたときは、バックエンドの SQL サーバから記事情報を取得し、テーマファイルやウィジェットなどと組み合わせて 1から HTML ページを作るしかありません。

しかし wp-cache があると、完成した HTML ページを wp-content/cache フォルダに格納しておき、2回目以降、同じ URL のリクエストがあると、その作り置きの HTML コンテンツを代わりに送ってくれます。

年中キャッシュデータばかり参照する仕様だと、例えば Web ページのレイアウトを更新しても永久に読者からは古いレイアウトしか見えなくなってしまうので、一つ一つのキャッシュは 1時間で賞味期限切れにしなさい、といった寿命 (expire time) があります。

WP-Cache Manager: expire time

wp-cache のパフォーマンスを測ってみる

効果も劇的です。http://www.nire.com/ トップページをリクエストして、結果が帰ってくるまでの時間を、apache のパフォーマンス測定ツール “ab” で簡単に測ってみました。3

平均所要時間 (Time per request) を比較すると、仮にキャッシュなしの所要時間を 100% として wp-cache ありだと 0.25%、実に 400倍ぐらい、もはやグラフに描いてもワケが分からないぐらい差が出ます。

WordPress: wp-cache キャッシュありとなしの比較

もともと VMware の仮想化マシンに置かれている www.nire.com がどんだけ遅いんだという話にもなるわけですが 🙂

これはあくまで、同じ URL, 同じ記事をリクエストし続け、2回目以降はキャッシュされている前提です。Nire.Com では、上位の人気記事というのはありながら、よく見たらあちこち読まれているタイプですので、キャッシュの効果は実際もっと下がります。それでも、PHP と SQL サーバの処理オーバーヘッドと、できあがり品の HTML コンテンツをほらよと返すのとでは歴然とした差があるようです。

しかし、WordPress って動的生成なのにキャッシュ? と思ったあなたは鋭い。実はこの wp-cache, 知ってはいたけれど、ぎりぎりまで入れたくない理由がありました。

つづく。


  1. お金 = cash のことだと思ってた人はそこで正座。 🙂 []
  2. 物理的な距離が遠いのではなく、中継リンクのホップ数が多すぎたり、回線速度が遅かったりして、通信に時間がかかる []
  3. ab Version 2.0.40, ab -n 100 -c 5 http://……. で測定 []