CodeZine(コードジン)

特集ページ一覧

超高速WordPress仮想マシン「KUSANAGI」に学ぶ、PHP+MySQLアプリチューニングの秘訣

高速WordPress実行環境「KUSANAGI」を支えるサーバの技術(1)

  • LINEで送る
  • このエントリーをはてなブックマークに追加

目次

KUSANAGI環境と標準LAMP環境のWordPressベンチマーク比較

 それでは、KUSANAGI環境とCentOS 7の標準LAMP環境を用意してそれぞれのWordPressのトップページでベンチマークを取って具体的な数値を把握するところから始めましょう。ベンチマークは2つ取るものとします。

 一つは、ブラウザでアクセスしてWordPressが生成するHTMLが何ミリ秒でサーバから返ってくるかを測定します。以降、この測定する時間を「ページのロード時間」と呼びます。測定にはブラウザの開発ツールを用います。本連載では、FirefoxにアドオンのFirebugをインストールして測定します。

 もう一つは、測定ツールのab(Apache Bench)で仮想マシン内部から自分自身にアクセスして、1秒あたりに処理できたアクセス数を測定します。以降、この数を「1秒あたりの同時アクセス数」と呼びます。

KUSANAGI環境の導入とベンチマーク

 KUSANAGI環境は、次のページを参考に自分の利用しやすいクラウドプラットフォームを選択してください。

 なお、クラウドプラットフォームを問わず、メモリ3.5GB以上のインスタンスをKUSANAGIの推奨環境としておりますが、学習用途としては、メモリは2GB以上あれば十分です。今回は具体的なベンチマークの結果を示す必要がありますので、本連載では、Microsoft Azure(新ポータル)のD1_V2 Standardインスタンス(1コア、3.5GBメモリ)を東日本リージョンで利用するものとして進めます。D1_V2 Standardインスタンスは、1か月約8000円前後のCPU性能を重視したインスタンスです。1時間の利用料は約11円ほどで、学習用途として4時間利用した場合の利用料は約44円です。便利な時代になったものです。なお、異なる環境で進める方は、以降、ご自身の環境に読み替えて進めてください。

 それでは、KUSANAGIを起動させてみましょう。次のページを参考に、KUSANAGIを起動させ、SSHで接続し、管理者ユーザーになるところまで進めてください。なお、リージョンは「東日本(Japan East)」をインスタンスサイズは「D1_V2 Standard」を選択、してください。

 以下、ホスト名(パブリックDNS)での名前解決が可能であり、ホスト名で仮想マシンにアクセスできるものとして進めます。名前解決は、クライアントマシンのhostsファイルなどの設定によるものでも構いません。ここでは、ホスト名がxxx.xxx.cloudapp.azure.comであるものとして進めます。

 管理者ユーザーになりましたら、KUSANAGIの初期設定を行います。次のページを参考にKUSANAGIの初期設定を行ってください。なお、ここからは各クラウドプラットフォーム共通の内容です。

 KUSANAGIの初期設定が完了したら、次のページを参考に、WordPressのプロビジョニングを行って、WordPressのインストールに必要なディレクトリの生成やファイル群の配置などを行います。hostnameの設定では、xxx.xxx.cloudapp.azure.comなど仮想マシンにアクセス可能なホスト名を入力してください。なお、今回はLet's Encryptの設定は行いませんので、Let's Encryptの設定時には、エンターキーを2回入力して処理をスキップしてください。

 プロビジョニングが完了したら、次のページを参考にWordPressをインストールします。

 WordPressのインストールが完了したら、コンソールに戻って、現在のステータスを確認しましょう。

[root@codezin-kusanagi ~]# kusanagi status

 次のような、ステータスが表示されます。

● nginx.service - nginx - high performance web server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2016-03-14 21:28:11 JST; 32min ago

● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: inactive (dead)

● hhvm.service - HHVM virtual machine, runtime, and JIT for the PHP language
   Loaded: loaded (/etc/systemd/system/hhvm.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2016-03-14 21:28:19 JST; 32min ago

● php-fpm.service - The PHP FastCGI Process Manager
   Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; disabled; vendor preset: disabled)
   Active: inactive (dead)

● php7-fpm.service - The PHP FastCGI Process Manager
   Loaded: loaded (/usr/lib/systemd/system/php7-fpm.service; disabled; vendor preset: disabled)
   Active: inactive (dead)

fcache off
bcache off

 kusanagi statusコマンドは、現在実行されているWebサーバ、PHP処理系、キャッシュの状況を表示します。初回起動時は、nginx+HHVM構成となっていることが確認できます。最後に表示されているfcache offはnginxのFastCGIキャッシュが無効になっていることを、bcache offはWordPressのKUSANAGI専用プラグインとして同梱されているページキャッシュが無効となっていることをそれぞれ示しています。なお、KUSANAGIコマンドやFAQなどについては、次のページを参照してください。

 それでは、ベンチマークを取っていきます。まず、最初に、Apache 2.4+PHP 5.6構成から始めます。ミドルウェアの切り替えもKUSANAGIコマンドで行います。kusanagi httpdコマンドでApache 2.4を有効に、kusanagi php-fpmコマンドで、PHP 5.6を有効にします。

[root@codezin-kusanagi ~]# kusanagi httpd 
[root@codezin-kusanagi ~]# kusanagi php-fpm

 これで、Apache 2.4+PHP 5.6構成になりましたので、abコマンドでベンチマークを取ります。

[root@codezine-kusanagi ~]# ab -n 100 -c 10 http://xxx.xxx.cloudapp.azure.com/

 次のような結果が得られます。

This is ApacheBench, Version 2.3 <$Revision: 1706008 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking codezine-kusanagi.japaneast.cloudapp.azure.com (be patient).....done


Server Software:        Apache
Server Hostname:        codezine-kusanagi.japaneast.cloudapp.azure.com
Server Port:            80

Document Path:          /
Document Length:        10946 bytes

Concurrency Level:      10
Time taken for tests:   3.232 seconds
Complete requests:      100
Failed requests:        0
Total transferred:      1124500 bytes
HTML transferred:       1094600 bytes
Requests per second:    30.94 [#/sec] (mean)
Time per request:       323.199 [ms] (mean)
Time per request:       32.320 [ms] (mean, across all concurrent requests)
Transfer rate:          339.77 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.0      0       0
Processing:   129  318  52.0    309     555
Waiting:      129  317  47.6    309     459
Total:        129  318  52.0    309     555

Percentage of the requests served within a certain time (ms)
  50%    309
  66%    323
  75%    338
  80%    352
  90%    375
  95%    406
  98%    460
  99%    555
 100%    555 (longest request)

 Requests per secondが1秒あたりの同時アクセス数です。10秒ほどインターバルをおいて、5回実行します。筆者の環境では、5回目が30.94となりました。

 ページのロード時間も測定します。Firefoxでトップページにアクセスします。Firebugを有効にして、ネットタブのタイムラインの最上段を確認します。筆者の環境ではおよそ38ms(38ミリ秒、0.038秒)となりました。

Firebugのネットタブでページのロード時間を確認する
Firebugのネットタブでページのロード時間を確認する

 同様のベンチマークを取っていきます。

 Apache 2.4+PHP 7構成へ、次のコマンドで切り替えます。

[root@codezine-kusanagi ~]# kusanagi php7

 abコマンドとFirebugを用いたベンチマークを取ります。筆者の環境では、1秒あたりの同時アクセス数は76.76、ページのロード時間はおよそ20msとなりました。

 Apache 2.4+HHVM 3.2構成へ、次のコマンドで切り替えます。

[root@codezine-kusanagi ~]# kusanagi hhvm

 abコマンドとFirebugを用いたベンチマークを取ります。筆者の環境では、1秒あたりの同時アクセス数は8回目のabコマンドで92.42、ページのロード時間はおよそ16msとなりました。HHVMは、初回のabコマンドで測定した同時アクセス数は、10前後となり、ベンチマークの回数を重ねるごとに性能が発揮されていき、7、8回で最高性能になります。詳しくは、連載の中で解説しますが、これは、バイトコードの生成とJITコンパイルを行うHHVMの特性です。

 続いて、nginxと各PHP処理系のベンチマークを取ります。nginxへの切り替えは、次のコマンドで行います。

[root@codezine-kusanagi ~]# kusanagi nginx

 筆者の環境でApacheの場合と同様のベンチマークを取った結果は次のようになりました。

  • PHP 5.6 31.24/s 38ms
  • PHP 7 80.05/s 17ms
  • HHVM 3.12 97.74/s 15ms

 ページのロード時間は、ネットワーク環境にも依存しますので、若干の揺らぎがありますが、おおむね、数パーセントほど、nginx環境の方が、Apache環境よりよい数値が出ました。

 標準LAMP環境との比較にはあまりなりませんが、参考までに、ページキャッシュを有効にしたKUSANAGI環境のベンチマークを取ります。

 次のコマンドで、WordPressのKUSANAGI専用プラグインのページキャッシュを有効化します。

[root@codezine-kusanagi ~]# kusanagi bcache on

 ここでは、PHP処理系はPHP 7でベンチマークを取りますので、次のコマンドでPHP 7に切り替えます。

[root@codezine-kusanagi ~]# kusanagi php7

 ページキャッシュを有効にした場合、abのベンチマークはリクエスト数が少ないとムラが大きくなりますので、リクエスト数を10000に、同時接続数も100に増加して実行します。

[root@codezine-kusanagi ~]# ab -n 10000 -c 100 http://xxx.xxx.cloudapp.azure.com/

 筆者の環境では、1秒あたりの同時アクセス数は1530.14、ページのロード時間は7ms前後となりました。

 最後に、次のコマンドで、nginxのFastCGIキャッシュを有効にしてベンチマークを取ります。

[root@codezine-kusanagi ~]# kusanagi fcache on

 筆者の環境では、1秒あたりの同時アクセス数は14942.95、ページのロード時間は測定不能となりました。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

バックナンバー

連載:高速WordPress実行環境「KUSANAGI」を支えるサーバの技術

著者プロフィール

あなたにオススメ

All contents copyright © 2005-2022 Shoeisha Co., Ltd. All rights reserved. ver.1.5