PaaSとして提供されている「Azure App Service」のwordpressのレスポンスが遅いので、構成によってどれぐらいの違いがあるのかを調べてみました。
構成
今回比較する構成で共通している部分は、東日本リージョン、PHP、wordpress7.4.1 + cocoon(テーマ)です。インフラ部分を少し変えた構成を比較してみました。
①「AppB1SQL8IO100」App Service + Azure Database for MySQL
①はPHP7.4ベースのApp ServiceにWordpressを手動で展開し、データベースもPaaSで安価なプランで構成しています。
項目 | 選択 |
---|---|
App Service | |
オペレーティングシステム | Linux |
ランタイムスタック | PHP7.4 |
プラン | B1 ( ACU 100, メモリ 1.75GB) |
Azure Database for MySQL | |
種類 | フレキシブルサーバー |
プラン | Standard_B1s (コア 1, メモリ 1GB, IOPS 100) |
MySQLバージョン | 8.0.21 |
②「AppB1SQL8IO320」App Service + Azure Database for MySQL
②は①と同様にPHP7.4ベースのApp ServiceにWordpressを手動で展開し、データベースのディスクIOPSを①の約3倍に増やしました。
項目 | 選択 |
---|---|
App Service | |
オペレーティングシステム | Linux |
ランタイムスタック | PHP7.4 |
プラン | B1 ( ACU 100, メモリ 1.75GB) |
Azure Database for MySQL | |
種類 | フレキシブルサーバー |
プラン | Standard_B1s (コア 1, メモリ 1GB, IOPS 320) |
MySQLバージョン | 8.0.21 |
③「AppB1SQL57IO100」App Service + Azure Database for MySQL
③は①と同様にPHP7.4ベースのApp ServiceにWordpressを手動で展開し、データベースのバージョンをダウンしています。
項目 | 選択 |
---|---|
App Service | |
オペレーティングシステム | Linux |
ランタイムスタック | PHP7.4 |
プラン | B1 ( ACU 100, メモリ 1.75GB) |
Azure Database for MySQL | |
種類 | フレキシブルサーバー |
プラン | Standard_B1s (コア 1, メモリ 1GB, IOPS 100) |
MySQLバージョン | 5.7 |
④「AppB2SQL57IO100」App Service + Azure Database for MySQL
④は③と同様にPHP7.4ベースのApp ServiceにWordpressを手動で展開していますが、プランをB2にスケールアップしました。
項目 | 選択 |
---|---|
App Service | |
オペレーティングシステム | Linux |
ランタイムスタック | PHP7.4 |
プラン | B2 ( ACU 200, メモリ 3.5GB) |
Azure Database for MySQL | |
種類 | フレキシブルサーバー |
プラン | Standard_B1s (コア 1, メモリ 1GB, IOPS 100) |
MySQLバージョン | 5.7 |
⑤「AppB1CtnrOnly」App Service
⑤はApp Serviceを「Dockerコンテナー」で構成し、Dockerイメージとしてwordpressとmysqlの最新版をデプロイしました。wordpressとmysqlのデータをApp Serviceのストレージに「WEBSITES_ENABLE_APP_SERVICE_STORAGE=TRUE」を設定することで恒久的に維持させています。
項目 | 選択 |
---|---|
App Service | |
オペレーティングシステム | Linux |
公開 | Docker コンテナー |
プラン | B1 ( ACU 100, メモリ 1.75GB) |
Docker Image | wordpress, mysql |
wordpressデータディスク | WEBAPP_STORAGE_HOME |
mysqlデータディスク | WEBAPP_STORAGE_HOME |
⑥「AppB1CtnrFiles」App Service + Azure Files
⑥は⑤と同様にApp Serviceを「Dockerコンテナー」で構成し、Dockerイメージとしてwordpressとmysqlの最新版をデプロイしました。mysqlのデータだけをAzure Filesのファイル共有を利用して保存しています。
項目 | 選択 |
---|---|
App Service | |
オペレーティングシステム | Linux |
公開 | Docker コンテナー |
プラン | B1 ( ACU 100, メモリ 1.75GB) |
Docker Image | wordpress, mysql |
wordpressデータディスク | WEBAPP_STORAGE_HOME |
mysqlデータディスク | Azure Files |
Azure Files | |
パフォーマンス | Standard |
ストレージ層 | トランザクション最適化 |
接続方法 | パブリック エンドポイント |
比較方法
比較はWindows端末で以下のスクリプトを実行して、50回アクセスしたレスポンス時間の平均値を計測しました。端末のWi-Fi接続などが影響しないように東日本リージョンAzure VM(Standard B2s)のWindows 10で実行します。
Param($url,$cnt)
$average=@()
while($cnt){
$time=Get-Date;
$ret=curl $url;
$time=(Get-Date)-$time;
$average+=$time.TotalSeconds
$cnt--;
}
[Math]::Round(($average | Measure-Object -Average).Average, 2, [MidpointRounding]::AwayFromZero);
計測結果
計測結果を以下に示します。
構成 | 計測値(秒) |
---|---|
①AppB1SQL8IO100 | 1.77 |
②AppB1SQL8IO320 | 1.83 |
③AppB1SQL57IO100 | 1.95 |
④AppB2SQL57IO100 | 1.86 |
⑤AppB1CtnrOnly | 3.36 |
⑥AppB1CtnrFiles | 2.61 |
- MySQLバージョン5.7と8では、0.18秒の差が出ています。8にすることで多少の効果がみられます。
- MySQLのディスクIOPSを100→320に増加させたとき速度はほぼ変わりませんでした。
- App ServiceのプランをB1→B2にスケールアップすると0.09秒速度もアップしています。
- App Serviceのマルチコンテナ機能を利用してMySQLも同じサービスで動作させた場合とMySQLを外部で動作させた場合では、1秒以上の差が出てしまいました。
- App ServiceのマルチコンテナのMySQLデータ書き込みだけ外部にすると、MySQL自体も外部に動作させるよりは劣るものの、App Service内に書き込むよりも0.75秒も速いです。
考察
少ないパターンで検証をしてみましたが、MySQLのバージョンアップとApp Serviceのプランの増強によって、「僅かな」スピードアップができると思われます。MySQLバージョンの差異で利用料金に影響はないので、バージョンアップするのは良いと思います。ただ、App ServiceのB1からB2へのスケールアップは料金が倍(約1,500円→3,000円)になります。0.09秒しか変わらないとなると、、、実施は微妙です。
また、マルチコンテナの結果から分かる通りApp Serviceに付属するデータ領域への書き込みが速度に影響してそうですが、データを外部へ逃がす方法をとっても運用速度には程遠いと思います。
ちなみに、AzureのIaaSであるAzure VM「Standard B1ms (1 vcpu 数、2 GiB メモリ)」で「OpenLiteSpeed」イメージを利用したwordpressでは「0.69秒」という結果でした!
PaaSではクラウド事業者が担当していた更新管理などが利用者側で行うことになりますが、この速さは魅力的です!
App Serviceでは、ディスク書き込みとPHP実行が反応速度の遅さに影響してそうですね。