WordPressの高速化
WordPressは、投稿ページやブログの内容など、多くの情報をデータベース(DB)に格納し、データベースへのI/O(Input / Output)により情報の出し入れを実現している。
データベースには、MySQLを使用することが多い。
WordPressはPHPにより動作しており、ユーザからページへのアクセスがある度に、PHPがスクリプト処理を実行し、データベースにデータを取りに行って…という処理を繰り返し行っている。
このデータベースのI/Oがボトルネックとなり、WordPressの処理が遅くなることが多い。
ボトルネックポイントであるにも関わらず、デフォルトのWordPress設定では、このデータベースI/O関連の設定は遅い(オーバーヘッドが大きい)設定になっている。
このMySQLデータベースへのI/Oを簡単に高速化する方法について紹介する。
WordPress と MySQL との接続概要
WordPress と MySQL との接続には、デフォルトの設定では、下図の「赤い線」で示したルートで接続されている。
所謂、TCP/IPで接続されているというやつだ。
WordPress と MySQL の接続構成図
WordPress の wp-config.php の MySQL 関連の設定は、下記のようになっていると思う。
wp-config.php抜粋
define( 'DB_HOST', 'localhost' );
これだと、localhost (127.0.0.1) というIPアドレスに対して、TCP/IP で接続するという設定だ。
(これは、WordPress と MySQL が異なるサーバに配置された時に、localhost ではなく、別サーバのIPアドレスを指定することで、データベース接続を実現するために、このような設定になっていると想定される)
同じサーバ内の接続なのに、わざわざ TCP パケットとするためにデータを包んで、3-way handshake で TCP セッションを確立してと、たいへん遅い(オーバーヘッドが大きい)。
そこで、下記のように設定してあげる。
高速化設定:wp-config.php
define( 'DB_HOST', 'localhost:/var/run/mysqld/mysqld.sock' );
このように、‘localhost:/var/run/mysqld/mysqld.sock’ を指定することで、上図の青いルートで WordPress と MySQL を接続させることが可能となる。
所謂、UNIXソケットで接続するというものだ。
(なお、/var/run/mysqld/mysqld.sock の場所は、自分の環境に合わせて変更すると良い。)
このようにすることで、TCP接続のオーバーヘッドを回避できるため、MySQLとのI/Oが高速化される。
海外のとある文献によると、20% ほど接続時間が短縮化されたとある。
体感効果
この WordPress と MySQL の UNIX domain socket による接続は、かなり体感効果が高い。
Google の PAGESPEED INSIGHT の結果、「最初のサーバ応答時間を速くしてください」というサーバ内の処理時間が遅いという項目の結果が、下記のように改善した。
before(TCP/IP): 1.6s
after(UNIX domain socket): 1.3s
だいたい 20% くらい速くなっている。
また、素晴らしいのが、WordPressの管理画面がサクサク動くことだ。
WordPressの管理画面は、かなりモッサリしたイメージの方が多いと思うが、データベースのI/Oを改善すると、これだけ快適にサクサク動くのかと感動した。
設定自体は、たった1行変更するだけで簡単なので、試してみる価値はあるかもしれない。
コメント