WordPress 2.6.x 高速化する、2つの大原則

ねこーWordPress を使い始めてから、Apache が固まる事象が多くでてるのです。このblogだけ停止する程度ならいいんですけど、他にも使っているユーザーもいるので、とても困るのです。
エラーとしては MaxClients までいってるぜ親分、的なエラーなのでMaxClients をあげるものの、際限なくリソースを使っていくんです。したがって、MaxClientsをあげればあげるほど、サーバ自体のリソースが無くなって、一度は OSまで落とされました。MaxClients=150 程度で落ちるなんてどないやねん。
ちなみに、我が家は Debian etch+PHP5 を選択しているため、困ったことに、Apache2 の mpm-prefork (Multi Process) しか使えないので、MaxClients をあげるとあげた分だけ 10M弱 Memory が取られていってるわけです。せめて、Multi Thread なら、とか考えたこともありましたが、これも我が道と考え、対応策を考えました。


[原因]

  • WordPress にしてから落ちるようになった
  • WordPress と MySQLの組み合わせをチューニングしていないからではないか

ということで、全部、WordPress の所為にしました。

[考慮点]
WordPress はすべてのページが phpで構成される動的コンテンツのみです。以前使用していた Serene Bach は、動的コンテンツは検索ページとか一部のみで、基本は静的コンテンツに変換されています。

「これだ」と思いましたね。

いろいろ探しましたけど、そんなことはできないんですけどね。

ということで、WordPress の最適化・高速化を実施することで、リソースが無駄に使われなくなって良いのではないかと、いくつか対策を練りました。

[高速化]

  1. MySQL クエリキャッシュ
    一つ目の高速化の原則は、MySQL のキャッシュを利用しましょう。です。WordPress では、いちいち MySQL に問い合わせをかけるため、topページであろうが毎度毎度 SELECT SQLが実行されてるようです。
    ということは、これらがキャッシュされれば MySQL の overhead は相当軽減されます。
  2. WordPress コンテンツキャッシュ
    次は WordPress が出力するコンテンツのキャッシュです。静的コンテンツの解決策に近いものですが、更新状況を見ながら、キャッシュタイミングを見てくれるようにするのがポイントです。これも、PHP で実行される部分を極力減らして、リソース消費を押さえ、かつクライアントでの表示自体も高速化されるわけです。
    ただ、コンテンツや widget によっては、キャッシュが効き過ぎて、動的に更新されない場合もあるので、使い分けは検討が必要です

他にも PHPのアクセラレート、Apache の最適化などありますが、Debian etch では面倒なので、この 2つだけで様子を見ることにしました。

[実施手順]

MySQL クエリキャッシュ
クエリ結果のキャッシュ を参考に実施しました。簡単です。
クエリキャッシュを有効にするには、mysql.ini ファイル中の「query_cache_type」をONに、「query_cache_size」を0より大きな適切な値に設定刷ればよいです。
Debian etch では、”/etc/mysql/my.cnf” 中の [mysqld] 項目に以下のように記述を追加・修正します。
[mysqld]
query_cache_limit=1M
query_cache_min_res_unit=4k
query_cache_size=24M
query_cache_type=1

WordPress コンテンツキャッシュ
WordPress 2.5未満のころは「WordPress高速化をやってみました」のように、”wp-config.php” 内に “define(‘ENABLE_CACHE’,true);” を定義すれば良かったのですが、WordPress 2.5 より、この機能が削除され、別の機能を取り込む必要があります。
詳細は WordPress の 「WordPress › Support » Is define(enable_cache, true) not working in 2.5?」トピックに書いてあるとおりで、”File-Based Extension to the WordPress Object Cache“を download して、”/wp-content/” 配下に zip内の “object-cache.php” を配置するだけです。
使用するためには、2.5以前と同様に、”wp-config.php” に “define(‘ENABLE_CACHE’,true);” を定義し、”/wp-content/cache” を作成しておく必要があるようです。