MySQL5.6新機能のInnoDB memcachedを使ってWordPressを高速化しようとしてみた話

InnoDB memcachedとは、key-valueストア(KVS)データモデルのmemcachedのプロトコルでMySQLのテーブルにアクセスできるプラグインです。
要はmemcachedのバックエンドがInnoDBになったよ、って解釈なんですがこれどうなんでせう。

MySQLで使えるなら使ってみて、ついでにWordPressを高速化するぜ!って思ったのが今回のきっかけ。

InnoDB memcached導入

まず下記コマンドで「innodb_memcached_config.sql」を流し込みます。

mysql -u root -p < /usr/share/mysql/innodb_memcached_config.sql 

「innodb_memcached_config.sql」はInnoDB memcachedに使用するスキーマとテーブルを作成します。また、KVSのデータを保存するテーブルを「demo_test」という名前で「test」データベースに作成しますので、「test」データベースを削除してしまった場合は、あらかじめ作成しておく必要があります。

また「innodb_memcache」というデータベースが作成され、その中の「containers」に設定が保存されています。

mysql> SELECT * FROM innodb_memcache.containers\G
*************************** 1. row ***************************
                  name: aaa
             db_schema: test
              db_table: demo_test
           key_columns: c1
         value_columns: c2
                 flags: c3
            cas_column: c4
    expire_time_column: c5
unique_idx_name_on_key: PRIMARY
1 row in set (0.01 sec)

初期設定では”aaa”という名前で「test」データベースの「demo_test」というテーブルの「c1」カラムにキーを「c2」カラムに値を保存する設定になっています。

また初期値として以下の様なデータが入っております。

mysql> SELECT * FROM test.demo_test;
+----+--------------+------+------+------+
| c1 | c2           | c3   | c4   | c5   |
+----+--------------+------+------+------+
| AA | HELLO, HELLO |    8 |    0 |    0 |
+----+--------------+------+------+------+
1 row in set (0.00 sec)

テーブルを作成しただけではもちろん動作しませんので、memcached pluginを読み込みます。

mysql> INSTALL PLUGIN daemon_memcached soname "libmemcached.so";
Query OK, 0 rows affected (0.09 sec)

SHOW PLUGINで確認できれば成功です。

mysql> SHOW PLUGINS;
+----------------------------+----------+--------------------+-----------------+---------+
| Name                       | Status   | Type               | Library         | License |
+----------------------------+----------+--------------------+-----------------+---------+
(中略)
| daemon_memcached           | ACTIVE   | DAEMON             | libmemcached.so | GPL     |
+----------------------------+----------+--------------------+-----------------+---------+
43 rows in set (0.00 sec)

こでれMySQLがポート11211でmemcachedとして動作するようになりました。

実際にtelnetで接続してデータをgetしてみます。

$ telnet localhost 11211
Trying ::1...
Connected to localhost.
Escape character is '^]'.
get AA
VALUE AA 8 12
HELLO, HELLO
END
quit
Connection closed by foreign host.

データが取得出来ました。

次にデータをsetしてみます。

$ telnet localhost 11211
Trying ::1...
Connected to localhost.
Escape character is '^]'.
set BB 0 0 3
BBB
STORED
quit
Connection closed by foreign host.
mysql> SELECT * FROM test.demo_test;
+----+--------------+------+------+------+
| c1 | c2           | c3   | c4   | c5   |
+----+--------------+------+------+------+
| AA | HELLO, HELLO |    8 |    0 |    0 |
+----+--------------+------+------+------+
| BB | BBB          |    0 |    1 |    0 |
+----+--------------+------+------+------+
2 row in set (0.01 sec)

データのセットも出来ました。

WordPressにmemcacheの設定追加

次にWordPressにmemcacheの設定を追加します。

php-memcacheがインストールされていなければインストールします。

yum -y install php-pecl-memcache

ちなみに環境はCentOS6.4。インストール後にhttpdを再起動し、phpinfo()でmemcacheが表示されていればOK。

th_phpinfo.memcache

次にWordPressに読み込ませるobject-cache.phpというファイルを設置します。
こちらよりダウンロードできますので、ダウンロードしたファイルを「wp-content」ディレクトリの中に設置します。これだけでこのファイルは勝手に読み込んでもらえます。

次に実際にWordPress上でプラグインをインストールし、memcacheの設定を行います。今回使用したのは「WP Memcached Manager」というプラグイン。

th_プラグイン ‹ sawara.me — WordPress 2014-06-10 09-25-09 2014-06-10 09-25-13

このプラグインを有効にすると左側のメニューに「Memcached」というのが表示されます。Memcahded -> Edit servers から、memcachedsサーバーの設定を行います。

th_Edit servers ‹ sawara.me — WordPress 2014-06-10 09-27-20 2014-06-10 09-27-30

設定が完了すると、Memcahded -> Memcahded に設定したサーバーがセレクトボックスで表示されますので、選択して「Manage Server」でサーバーの状態を確認します。

th_WP Memcached Manager ‹ sawara.me — WordPress 2014-06-10 09-28-43 2014-06-10 09-28-48

「GET TEST」・「SET TEST」ともにSUCCESSになっていればOKです。

実行結果

このブログの表示速度で検証してみました。表示速度はここで計測しました。

befor

th_before01

after

th_after01

う、嘘だろっ、おい!倍以上も遅くなってんじゃねえか!!

・・まあ、なんか設定値とかいじらないとパフォーマンス出ないんでしょう(たぶん)。この規模で必要ないよねってな話もありますが、検証用ということで今後いろいろイジって見たいと思います。

ということで、今日はここまで。

コメントを残す