冗長化せずにテレビ放映に耐えるEC-CUBEを構築する
仕事柄、いくつか EC-CUBE のホスティングサービスを提供しています。
弊社では Microsoft Azure の仮想マシン(IaaS)を利用しているのですが、多くのサイトは潤沢な予算がなく、Webサーバーの冗長構成をしておりません。
データベースもWebサーバーと同居しています。
もちろん、このような構成ですと、クラウドといえどもスケールアウトはできません。
しかし、中にはテレビ放映されるネットショップもありまして、シングル構成でできるかぎりの性能向上を求められます。
今回、特別なチューニングや仮想マシンのスケールアウト(冗長構成)をせずにできるかぎりの対策をした結果をレポートしてみます。
TV放映予定
金曜19時〜22時の特番にてOA予定。
どのように紹介されるか不明だが、某有名タレントさんのお気に入りとして紹介される模様。
という情報をいただきました。
以前は1000人程度の同時アクセスでサーバーダウンしたそうなので、それ以上の性能向上を狙ってみます。
対策内容
当該サイトは、トップページ配下は WordPress、 /shop 以下は EC-CUBE4.1系という構成です。
OSは AlmaLinux8、PHP7.4、データベースは MySQL で、Webサーバーと同居しています。
平常時は1CPUメモリ2GB(b1ms)のインスタンスを使用しています。
EC-CUBEをスケールアウト可能な構成にするためには、画像を外部ストレージやCDNから配信したり、サーバー上のファイルを直接編集するCMS機能など、ある程度の改修が必要です。
今回、そこまでの予算は無いため、標準構成でできるかぎりの対策を検討しました。
対応内容としては以下の3点です。
WordPress Cloudflare プラグイン導入
このサイトはWAFに Cloudflare を導入しているため、WordPress Cloudflare プラグイン を導入しました。
このプラグインを利用すると、 WordPress のコンテンツを Cloudflare の CDN から配信できるため、大幅な性能向上が期待できます。
b12ms(12CPU 48GB)にスケールアップ
テレビ放映の場合、瞬間的にトラフィックが急増するため、オートスケールは意味をなさない場合が多いです。
今回はテレビ放映前に12CPUメモリ48GBのインスタンスにスケールアップすることにしました。
クライアントへは了承を得て、スケールアップ時にサーバーを再起動しています。
AlmaLinux8 の標準構成のPHPは、Apache eventMPM + php-fpm ですので、スケールアップに応じた性能向上が期待できます。
(mod_php の場合は、Apache の最大クライアント数(デフォルト256)に依存するためスケールアップの効果は乏しいです)
Premium SSD
標準は Standard SSD ですので、Premium SSD に変更しました。変更にはサーバーの一時停止が必要です。
最近のフレームワークを利用したPHPアプリケーションは、リクエストごとに多くの細かいPHPファイルを読みこむため、ストレージの性能は重要です。
ログ出力にも影響があります。
ちなみに、EC-CUBE4系は共有ストレージ(AWS EFSなど)を使用すると全く性能が出ません(Symfony のキャッシュで大量の小さなサイズのPHPファイルを読み込むためです)
結果
当日20時6分ごろ、30秒程度紹介されました。
ゴールデンタイムということもあり、放映直後にリクエスト数が跳ね上がりました。
ユニークユーザー数
全体ピーク時 約800UU でした。
Cloudflare プラグインも性能を発揮したようで、サーバーの応答速度は全く落ちませんでした。
サーバーの性能にダイレクトに影響する /shop以下は、ピーク時 約690UU でした。
多くのユーザーが直接商品を閲覧したことになります。
リクエスト数
全体ピーク時 約34000リクエスト(約567 req/sec)
/shop以下 ピーク時 約24700リクエスト(約411 req/sec)
シングル構成では申し分のない性能を発揮してくれたと思います。
購入完了ページである /shopping/complete は最大10リクエスト/分でした。
レスポンスタイム
外形監視のレスポンスタイムは100ms台で変化なしでした。
CPU利用率
ピーク時 約12% でした。12CPUですので、1200%まで耐えられることになります。全然余裕でした。
ネットワーク
トラフィックのピーク時 Network Out total 410MiBでした。
Cloudflare の CDN も威力を発揮してくれたため、全く問題は発生しませんでした。
まとめ
30秒間の放映でしたが、まだまだ性能に余裕がありそうです。
スケールアップのコストも100円/時間程度で済みました。
今回の構成で1000UU程度の同時アクセスは余裕ということがわかりましたので、次なるTV放映や、Yahoo砲などに望みたいと思います。
Discussion