WordBench.org のサーバをチューニング

最近 WordBench が、当サイトと同じめ組のVPSに引っ越して来ました。
そんな縁もあって WordBench.org のサーバのチューニングを手伝ったのでメモ。
今回、行ったチューニングは Apache, PHP, MySQL についてだけで、WordPress のプラグインを用いる ( WP Super Cacheobject cache など ) チューニングは行っていません。
WP Super Cache とか使わなくても、サーバー側の設定をつめてやるだけで、子サイトを複数持った WordBench のようなサイトでも、十分に良いパフォーマンスが得られますよっていうお話です。

大まかな項目は、こんな感じ。

  • PHP の設定 – PHP アクセラレータ eAccelerator の導入
  • Apache の設定 – mod_deflate, mod_expires の有効化
  • MySQL の設定 – クエリキャッシュ, ソートバッファ等の設定

PHP の設定

PHPスクリプトを解析した結果を中間コードの状態で共有メモリ上にキャッシュする eAccelerator を導入しました。
WordPress のような多数の PHP スクリプトをインクルードするアプリでは、特に威力を発揮します。

PHP5 を使用している場合は、PHP アクセラレータとしては APC か eAccelerator の二択になります。
PECL でインストールできる APC の方がお手軽なんですが、今回は eAccelerator を使用しました。

ただし、インストールは PECL で一発って訳にはいかないので敷居は高いかもです。
インストール方法は、以前のエントリでさらっと触れてるので、そちらを参照してください。
さくらVPSに lighttpd + PHP 5.3 + MySQL 5.1 をインストール : dogmap.jp

WordBench サイトでは無いですが、実験環境に WordPress のサイトを準備して Apachebench で ab -n 100 -c 10 して検証した結果はこんな感じです。

Time taken for tests Complete requests Failed requests Requests per second Time per request
Apache アクセラレータ無し 403.793 sec 100 76 0.25 [#/sec] 4037.927 [ms]
Apache + APC 20.997 sec 100 2 4.76 [#/sec] 209.969 [ms]
Apache + eAccelerator 20.757 sec 100 0 4.82 [#/sec] 207.566 [ms]
lightppd アクセラレータ無し 27.168 sec 100 0 3.68 [#/sec] 271.678 [ms]
lightppd + APC 18.326 sec 100 3 5.46 [#/sec] 183.258 [ms]
lightppd + eAccelerator 19.040 sec 100 0 5.25 [#/sec] 190.396 [ms]

※すべて同じサーバ上で実験しています。

アクセラレータ無しと比べると圧倒的なパフォーマンスをたたき出してますね。

Apache の設定

WordBench サーバを収容しているデータセンターはサンノゼにあるため通信量を抑える必要があります。
というわけで /etc/httpd/conf.d/ に以下のような内容の設定ファイルを追加し mod_deflate と mod_expires を設定しました。

AddType image/x-icon .ico
  
<IfModule mod_deflate.c>
  SetOutputFilter DEFLATE
  BrowserMatch ^Mozilla/4 gzip-only-text/html
  BrowserMatch ^Mozilla/4\.0[678] no-gzip
  BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html
  SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png|ico)$ no-gzip dont-vary
  SetEnvIfNoCase Request_URI _\.utxt$ no-gzip
  #DeflateCompressionLevel 4
  AddOutputFilterByType DEFLATE text/plain
  AddOutputFilterByType DEFLATE text/html
  AddOutputFilterByType DEFLATE text/xml
  AddOutputFilterByType DEFLATE text/css
  AddOutputFilterByType DEFLATE application/xhtml+xml
  AddOutputFilterByType DEFLATE application/xml
  AddOutputFilterByType DEFLATE application/rss+xml
  AddOutputFilterByType DEFLATE application/atom_xml
  AddOutputFilterByType DEFLATE application/x-javascript
  AddOutputFilterByType DEFLATE application/x-httpd-php
</IfModule>
  
<ifModule mod_expires.c>
  ExpiresActive On
  ExpiresDefault "access plus 1 seconds"
  ExpiresByType text/html "access plus 1 seconds"
  ExpiresByType image/gif "access plus 2592000 seconds"
  ExpiresByType image/jpeg "access plus 2592000 seconds"
  ExpiresByType image/png "access plus 2592000 seconds"
  ExpiresByType image/x-icon "access plus 2592000 seconds"
  ExpiresByType text/css "access plus 604800 seconds"
  ExpiresByType text/javascript "access plus 216000 seconds"
  ExpiresByType application/x-javascript "access plus 216000 seconds"
  ExpiresByType application/x-shockwave-flash "access plus 216000 seconds"
</ifModule>
  
FileETag none

Apache の設定については、他には特殊な設定はほとんど行っていません。
運用しながら詰めていく必要がありますね。

MySQL の設定

基本的に MySQL サーバは WordPress でしか使用しない前提で InnoDB を無効にしました。
InnoDB を全く使用していない環境でも InnoDB プロセスが立ち上がると、かなりメモリを圧迫してしまうためです。
メモリが潤沢にあるとはいえない VPS 環境で WordPress を動作させるなら、/etc/my.cnf に skip-innodb オプションを追加して無効にしておいたほうが良いでしょう。

後は、空メモリと相談してクエリキャッシュやらソートバッファやらを追加しました。
これも運用しながら、設定値を詰めていく必要があります。
現在の設定値は、こんな感じです。

[mysqld]
default-character-set=utf8
skip-innodb
max_connections=30
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
bind-address=127.0.0.1
old_passwords=1
symbolic-links=0
 
query_cache_size=96M
query_cache_limit=1M
query_cache_min_res_unit=4k
query_cache_type=1
tmp_table_size=128M
max_heap_table_size=128M
table_cache=128
max_allowed_packet=1M
sort_buffer=1M
read_buffer_size=1M
read_rnd_buffer_size=1M
join_buffer_size=1M
key_buffer_size=32M
 
long-query-time=2
slow_query_log=1
slow_query_log_file=/var/log/mysqld-slow.log

query_cache_size, tmp_table_size は、サーバの搭載メモリ数から考えると、かなり多めに取ってあります。

まとめ

最終的にこの状態で、全部で780MB利用できるメモリのうち、空きは230MBほど確保してあります。
子サイトが大量にあるマルチサイトとしては妥当なところでは無いでしょうか。
Web サーバとして Apache では無く、軽量 Web サーバである lighttpdnginx を採用すれば、さらに軽く動作させることができるでしょう。
最近セットアップを手伝ったカイさんのサイトは、さくらの VPS でメモリがさらにプア(512MB) なため lighttpd を採用させてもらいました。

実際 nginx なんかは WordPress.com でも採用されていて WordPress とも相性が良いと思われます。
ただ、マルチサイト運用時の nginx や lighttpd の資料が中々出てこなかったため、今回は見送らせてもらいました。
この辺の資料を Automattic さんが出してくれると嬉しいなぁとか思ったり思わなかったり。

root 権限がもらえない共有レンタルサーバではできなかった種々のチューニングを施すことができる VPS は楽しいですね。
ただし、各種セキュリティ設定やソフトウエアのアップデートは、共有レンタルサーバのようにホスティング会社に丸投げって訳にはいきません。
ほっておくとセキュリティホール突かれて乗っ取られる危険もあります。
VPS で運営するのであれば、適切なセキュリティ設定と日々のログ監視を行うようお願いします。

2 thoughts on “WordBench.org のサーバをチューニング

  1. ピンバック: 最近WordPressの管理画面が重い » murmur

  2. ピンバック: Tweets that mention WordBench.org のサーバをチューニング : dogmap.jp -- Topsy.com

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください