2017/10/10 Kazunori Inaba
2017.10.10
第20回 JAWS-UG札幌 勉強会
EC-CUBEによるECサイトの負荷対策
稲葉 一紀@札幌
1
2017/10/10 Kazunori Inaba
稲葉 一紀 (Kazunori Inaba)
サーバーインフラ専門のフリーランスエンジニア@札幌
屋号:稲葉サーバーデザイン
https://inaba-serverdesign.jp/
おもにWeb制作会社、アプリ開発企業・エンジニア向けに
セキュリティ・可用性・性能・拡張性を考慮した
サーバーインフラ構成設計・設定や既存システムの
性能改善調査・支援
や
ミドルウェアの導入・チューニング
などを行います。
2
自己紹介
はじめに
2017/10/10 Kazunori Inaba
• EC-CUBEによるECサイトの負荷対策を行った事例をご紹介します。
• スライドは後日SlideShareにアップします。
http://www.slideshare.net/kazunoriinaba/
Webサイトでも公開します。
https://inaba-serverdesign.jp/
3
負荷対策を行ったECサイト
2017/10/10 Kazunori Inaba
• AWS上で稼働するEC-CUBEによる販売サイト
• サイト名、業種は非公開
• 当初のサーバー構成
• Web: EC2 (CentOS 6, Plesk, Nginx, PHP-FPM, EC-CUBE) x 1
• DB : RDS for MySQL x 1
• セール開始直後から1時間程度、集中アクセスが発生する。
→ ページが表示されない、502エラー。
あるセール日の集中アクセス
- リクエスト数: 数万/分
- リアルタイムセッション数: 2000超
4
当初の構成 – 構成図
2017/10/10 Kazunori Inaba 5
EC-CUBE
セール時のみスケールアップセール時のみスケールアップ
当初の構成 - セール時どうなった?
2017/10/10 Kazunori Inaba 6
EC-CUBE
ページが表示
されない。
502エラー!
負荷対策(1) – 構成図
2017/10/10 Kazunori Inaba 7
EC-CUBE管理
EC-CUBE公開
静的コンテンツ
動的コンテンツ
静的コンテンツ
パス: /admin/~
(default)
・静的コンテンツをCloudFrontで
配信
・ EC2を複数台としALBで振り分け
・ Nginx, PHP, MySQLのパラメー
タチューニング
負荷対策(1) – CloudFrontの導入
2017/10/10 Kazunori Inaba
• 静的コンテンツをCloudFrontで配信
• EC2の負荷を軽減
8
EC-CUBE管理
静的コンテンツ
定期的にjs, css, imageファイ
ルをS3にアップロード
https://cdn.example.jp
S3オリジンで配信
https://example.jp
負荷対策(1) – EC2を複数台に
2017/10/10 Kazunori Inaba
• EC2を複数台とし、ALBで振り分け
• 管理用(1台)と公開用(複数台)に用途を分けてURLパスで振り分け。
• EC-CUBEのセッション管理はRDBで行っているので問題ない。
• EC2単体の負荷軽減。
• 可用性の向上。メンテナンス、スケールアップ時のダウンタイムを軽減。
9
EC-CUBE管理
EC-CUBE公開
パス: /admin/~
(default)
負荷対策(1) – 複数EC2間のデータ同期
2017/10/10 Kazunori Inaba
• /html/{upload,user_data}, /data/{download,downloads,upload}など
• S3バケットを介して管理用→公開用の向きで定期的に同期
• データ同期の向きを片方向にしないと古いファイルで上書きされることに注意。
• lsyncdによる同期だとサーバーが増えたときの設定追加が手間。
10
EC-CUBE管理
EC-CUBE公開
$ aws s3 sync <local> <s3://bucket/>
データ同期用
$ aws s3 sync <s3://bucket/> <local>
パス: /admin/~
(default)
PUT
GET
負荷対策(1) – セール時どうなった?
2017/10/10 Kazunori Inaba 11
EC2の負荷は激減!
EC-CUBE管理
EC-CUBE公開
静的コンテンツ
動的コンテンツ
静的コンテンツ
パス: /admin/~
(default)
RDSに負荷が集中!
ページが表示されな
い。502エラー!
db.m4.10xlarge (40CPU)
でもCPU使用率100%
負荷対策(2) – 構成図
2017/10/10 Kazunori Inaba 12
EC-CUBE管理
EC-CUBE公開
静的コンテンツ
動的コンテンツ
静的コンテンツ
パス: /admin/~
(default)
セッションを
キャッシュ
クエリキャッシュ
DBまわりの構成変更で
RDSの負荷を軽減
負荷対策(2) - 変更点
2017/10/10 Kazunori Inaba
• RDSリードレプリカ、ElastiCache for Redisを追加
• EC-CUBEの改修(担当:ウェブモ株式会社)
• セッション情報の保存先をRDSからElastiCache for Redisに変更。
• データベースのインデックスチューニング。
• ページ単位でDBアクセス先を指定可能とした。
• 更新系ページは、RDSマスターにアクセス。
• 参照系ページは、ElastiCache for Redisにアクセス。
• キャッシュがあればRedisから取得。
• キャッシュがなければRDSリードレプリカにアクセスしRedisに保存。
13
RDSの負荷軽減
→ DBクエリ数、処理行数を減らす!
→ ディスクアクセスを減らす!
負荷対策(2) – 参照系ページのデータ取得
2017/10/10 Kazunori Inaba 14
EC-CUBE公開
クエリキャッシュ
①Redisに
問い合わせ
②キャッシュにあ
ればデータ取得
③キャッシュになけ
ればリードレプリカ
に問い合わせ
④データ取得
⑤Redisにデータ
保存
負荷対策(2) – セール時どうなった?
2017/10/10 Kazunori Inaba 15
EC-CUBE管理
EC-CUBE公開
静的コンテンツ
動的コンテンツ
静的コンテンツ
パス: /admin/~
(default)
セッションを
キャッシュ
クエリキャッシュ
RDSの負荷
が激減!
・セール時も軽快に買い物できる
ようになった!
・EC2, RDSのインスタンスタイ
プを下げてコスト削減を達成。
負荷対策(2) - 一時発生した問題
2017/10/10 Kazunori Inaba
• 順調に稼働していたが、突然RDSマスターのCPU負荷が増大
• 大量のロック競合が発生していた。
• ロック競合は、 EC-CUBEプラグイン「売り切れ時のメール送信」「キャンセル
時の在庫戻し」機能によるものだった。
• これらのプラグインを削除すると、ロック競合がなくなり、CPU負荷が激減し
た。
• プラグインの不具合というよりは、EC-CUBEもプラグインも、もともと集中ア
クセス用には作られていない?
16
負荷テスト環境 on AWS
2017/10/10 Kazunori Inaba
(参考)Developers.IO AWSでJMeterを使った負荷テスト環境を構築する手順
(WindowsありのMaster/Slave構成)
http://dev.classmethod.jp/etc/jmeter-master-slave/
17
Windows
JMeter Master
Linux
JMeter Slave
EC-CUBE管理
EC-CUBE公開
負荷をかける側 ECサイト(検証用)
まとめ (1)
2017/10/10 Kazunori Inaba
ECサイトのサーバー負荷に対して、主に以下の対策を行った。
1. CloudFrontによる静的コンテンツ配信
2. EC2を複数台に
3. ElastiCache for Redisによるクエリキャッシュ
アクセス集中時のレスポンスが大きく改善できた。
3.が最も効果的。
これらの対策は、EC-CUBEに限らず、どんなWebアプリケーションで
もだいたい同じ。
18
まとめ (2)
2017/10/10 Kazunori Inaba
• サーバー側だけではなく、アプリケーション側の改善が必須。
• 例えば、サーバーのリソース合計を10倍しても、性能アップは10倍以下。
• Apache/Nginx, PHP, MySQLのパラメータチューニングでも性能向上は限定さ
れる。
• memcached/Redisによるクエリキャッシュの導入や適切なDBインデックスチ
ューニングは、それ以上の劇的な性能改善効果があり得る。
【アプリケーション改善の参考資料】
• クラウド時代だからこそ見直したいPHPアプリケーションのパフォーマンスチュー
ニング
https://www.slideshare.net/marcyterui/php-60979337
19

EC-CUBEによるECサイトの負荷対策

  • 1.
    2017/10/10 Kazunori Inaba 2017.10.10 第20回JAWS-UG札幌 勉強会 EC-CUBEによるECサイトの負荷対策 稲葉 一紀@札幌 1
  • 2.
    2017/10/10 Kazunori Inaba 稲葉一紀 (Kazunori Inaba) サーバーインフラ専門のフリーランスエンジニア@札幌 屋号:稲葉サーバーデザイン https://inaba-serverdesign.jp/ おもにWeb制作会社、アプリ開発企業・エンジニア向けに セキュリティ・可用性・性能・拡張性を考慮した サーバーインフラ構成設計・設定や既存システムの 性能改善調査・支援 や ミドルウェアの導入・チューニング などを行います。 2 自己紹介
  • 3.
    はじめに 2017/10/10 Kazunori Inaba •EC-CUBEによるECサイトの負荷対策を行った事例をご紹介します。 • スライドは後日SlideShareにアップします。 http://www.slideshare.net/kazunoriinaba/ Webサイトでも公開します。 https://inaba-serverdesign.jp/ 3
  • 4.
    負荷対策を行ったECサイト 2017/10/10 Kazunori Inaba •AWS上で稼働するEC-CUBEによる販売サイト • サイト名、業種は非公開 • 当初のサーバー構成 • Web: EC2 (CentOS 6, Plesk, Nginx, PHP-FPM, EC-CUBE) x 1 • DB : RDS for MySQL x 1 • セール開始直後から1時間程度、集中アクセスが発生する。 → ページが表示されない、502エラー。 あるセール日の集中アクセス - リクエスト数: 数万/分 - リアルタイムセッション数: 2000超 4
  • 5.
    当初の構成 – 構成図 2017/10/10Kazunori Inaba 5 EC-CUBE セール時のみスケールアップセール時のみスケールアップ
  • 6.
    当初の構成 - セール時どうなった? 2017/10/10Kazunori Inaba 6 EC-CUBE ページが表示 されない。 502エラー!
  • 7.
    負荷対策(1) – 構成図 2017/10/10Kazunori Inaba 7 EC-CUBE管理 EC-CUBE公開 静的コンテンツ 動的コンテンツ 静的コンテンツ パス: /admin/~ (default) ・静的コンテンツをCloudFrontで 配信 ・ EC2を複数台としALBで振り分け ・ Nginx, PHP, MySQLのパラメー タチューニング
  • 8.
    負荷対策(1) – CloudFrontの導入 2017/10/10Kazunori Inaba • 静的コンテンツをCloudFrontで配信 • EC2の負荷を軽減 8 EC-CUBE管理 静的コンテンツ 定期的にjs, css, imageファイ ルをS3にアップロード https://cdn.example.jp S3オリジンで配信 https://example.jp
  • 9.
    負荷対策(1) – EC2を複数台に 2017/10/10Kazunori Inaba • EC2を複数台とし、ALBで振り分け • 管理用(1台)と公開用(複数台)に用途を分けてURLパスで振り分け。 • EC-CUBEのセッション管理はRDBで行っているので問題ない。 • EC2単体の負荷軽減。 • 可用性の向上。メンテナンス、スケールアップ時のダウンタイムを軽減。 9 EC-CUBE管理 EC-CUBE公開 パス: /admin/~ (default)
  • 10.
    負荷対策(1) – 複数EC2間のデータ同期 2017/10/10Kazunori Inaba • /html/{upload,user_data}, /data/{download,downloads,upload}など • S3バケットを介して管理用→公開用の向きで定期的に同期 • データ同期の向きを片方向にしないと古いファイルで上書きされることに注意。 • lsyncdによる同期だとサーバーが増えたときの設定追加が手間。 10 EC-CUBE管理 EC-CUBE公開 $ aws s3 sync <local> <s3://bucket/> データ同期用 $ aws s3 sync <s3://bucket/> <local> パス: /admin/~ (default) PUT GET
  • 11.
    負荷対策(1) – セール時どうなった? 2017/10/10Kazunori Inaba 11 EC2の負荷は激減! EC-CUBE管理 EC-CUBE公開 静的コンテンツ 動的コンテンツ 静的コンテンツ パス: /admin/~ (default) RDSに負荷が集中! ページが表示されな い。502エラー! db.m4.10xlarge (40CPU) でもCPU使用率100%
  • 12.
    負荷対策(2) – 構成図 2017/10/10Kazunori Inaba 12 EC-CUBE管理 EC-CUBE公開 静的コンテンツ 動的コンテンツ 静的コンテンツ パス: /admin/~ (default) セッションを キャッシュ クエリキャッシュ DBまわりの構成変更で RDSの負荷を軽減
  • 13.
    負荷対策(2) - 変更点 2017/10/10Kazunori Inaba • RDSリードレプリカ、ElastiCache for Redisを追加 • EC-CUBEの改修(担当:ウェブモ株式会社) • セッション情報の保存先をRDSからElastiCache for Redisに変更。 • データベースのインデックスチューニング。 • ページ単位でDBアクセス先を指定可能とした。 • 更新系ページは、RDSマスターにアクセス。 • 参照系ページは、ElastiCache for Redisにアクセス。 • キャッシュがあればRedisから取得。 • キャッシュがなければRDSリードレプリカにアクセスしRedisに保存。 13 RDSの負荷軽減 → DBクエリ数、処理行数を減らす! → ディスクアクセスを減らす!
  • 14.
    負荷対策(2) – 参照系ページのデータ取得 2017/10/10Kazunori Inaba 14 EC-CUBE公開 クエリキャッシュ ①Redisに 問い合わせ ②キャッシュにあ ればデータ取得 ③キャッシュになけ ればリードレプリカ に問い合わせ ④データ取得 ⑤Redisにデータ 保存
  • 15.
    負荷対策(2) – セール時どうなった? 2017/10/10Kazunori Inaba 15 EC-CUBE管理 EC-CUBE公開 静的コンテンツ 動的コンテンツ 静的コンテンツ パス: /admin/~ (default) セッションを キャッシュ クエリキャッシュ RDSの負荷 が激減! ・セール時も軽快に買い物できる ようになった! ・EC2, RDSのインスタンスタイ プを下げてコスト削減を達成。
  • 16.
    負荷対策(2) - 一時発生した問題 2017/10/10Kazunori Inaba • 順調に稼働していたが、突然RDSマスターのCPU負荷が増大 • 大量のロック競合が発生していた。 • ロック競合は、 EC-CUBEプラグイン「売り切れ時のメール送信」「キャンセル 時の在庫戻し」機能によるものだった。 • これらのプラグインを削除すると、ロック競合がなくなり、CPU負荷が激減し た。 • プラグインの不具合というよりは、EC-CUBEもプラグインも、もともと集中ア クセス用には作られていない? 16
  • 17.
    負荷テスト環境 on AWS 2017/10/10Kazunori Inaba (参考)Developers.IO AWSでJMeterを使った負荷テスト環境を構築する手順 (WindowsありのMaster/Slave構成) http://dev.classmethod.jp/etc/jmeter-master-slave/ 17 Windows JMeter Master Linux JMeter Slave EC-CUBE管理 EC-CUBE公開 負荷をかける側 ECサイト(検証用)
  • 18.
    まとめ (1) 2017/10/10 KazunoriInaba ECサイトのサーバー負荷に対して、主に以下の対策を行った。 1. CloudFrontによる静的コンテンツ配信 2. EC2を複数台に 3. ElastiCache for Redisによるクエリキャッシュ アクセス集中時のレスポンスが大きく改善できた。 3.が最も効果的。 これらの対策は、EC-CUBEに限らず、どんなWebアプリケーションで もだいたい同じ。 18
  • 19.
    まとめ (2) 2017/10/10 KazunoriInaba • サーバー側だけではなく、アプリケーション側の改善が必須。 • 例えば、サーバーのリソース合計を10倍しても、性能アップは10倍以下。 • Apache/Nginx, PHP, MySQLのパラメータチューニングでも性能向上は限定さ れる。 • memcached/Redisによるクエリキャッシュの導入や適切なDBインデックスチ ューニングは、それ以上の劇的な性能改善効果があり得る。 【アプリケーション改善の参考資料】 • クラウド時代だからこそ見直したいPHPアプリケーションのパフォーマンスチュー ニング https://www.slideshare.net/marcyterui/php-60979337 19