Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PHPで作られた大規模ECサイトから学ぶ負荷対策入門 in PHP Conference 2026

Avatar for ozaki-kota ozaki-kota
July 19, 2026
1.2k

PHPで作られた大規模ECサイトから学ぶ負荷対策入門 in PHP Conference 2026

Avatar for ozaki-kota

ozaki-kota

July 19, 2026

Transcript

  1. ECサービスの特徴 クリエイ ター向け 運営向け 共通DB 社内API2 社内API1 社内API N EC

    元々全社で1つのシステムだったのがここまで分割された ECはアグリゲーションでユーザー最適化された描画が行われている © DMM 5
  2. ECサービスの特徴 - 毎年PV数が140%前後の増加 - 0時過ぎにアクセスピーク - 休日にアクセス量が増加 - 月初にアクセス量が増加 -

    夏/冬の大規模イベント後にアクセス量が増加 - クーポン/キャンペーンでアクセス量が増加 - キャンペーン終了タイミングでアクセス量が増加 © DMM 6
  3. 基本は計測と算出 下記の式が成り立つようにする 要求処理数/秒 = 基準日の処理数/秒 x ( 1 + 想定増加率

    + α ) 要求処理数/秒 = 秒間処理数/台 x サーバー台数 秒間処理数/台 = pm.max_children x 1000ms / 平均処理時間ms pm.max_children = 割り当て可能なメモリ / memory_limit 基準日の処理数、平均処理時間msは計測から取得する。特に今入っていないならAPMを入れると最 低限必要なものは取得できる ※ PHP-FPMの例 ※ 1つの考え方で常にこれに合わせる必要はない © DMM 9
  4. DBやキャッシュ、APIの接続数を算出する PHPからの接続先は下記の式が成り立つようにする 最大同時接続数 = pm.max_children x サーバー台数 接続先の最大接続数 >= 最大同時接続数

    レプリカなどで複数台に分散する場合は下記の式が成り立つようにする 接続先の最大接続数 >= 最大同時接続数 / 台数 * 偏り係数 これは成り立たない場合は最悪ケースでは接続上限でエラーが発生する ※ 1つの考え方で常にこれに合わせる必要はない。非同期系入れてると成り立たない © DMM 10
  5. 2023年 冬キャンペーン障害 購入後処理が捌ききれずに購入した作品を表示できなくなった バスケット レジ 購入 後処理 1. 0時前にクーポンの期限間際の駆け込み需要で購入上限数の購入が多く発生 2.

    それに伴いDBが高負荷になる 3. 後処理が遅延&滞留によりDBでToo many connectionsでリトライが発生しさらに遅延 4. 0時過ぎのピーク後に購入減少し、順次リトライすることによって収束 © DMM 14
  6. 事実を元にタイムラインを書く 23:59 00:00 キャッシュ解放バッチが動作 Redisのexpired_keysがXX増 加RedisのCPU使用率がYY増 加 キャッシュ解放ジッターが動作 開始 Redisのexpired_keysがXX増

    加RedisのCPU使用率がYY増 加 00:01 00:02 キャッシュ解放バッチが終了 - Redisのexpired_keysの増加 率がXX減少 RedisのCPU使用率がYY減少 Redisのgetのレイテンシが XX 増加 該当時間帯に起きたこと、変化したメトリクスを時系列にまとめる 前後関係が重要なことが多いので可能なら秒単位でまとめられるのが望ましい あくまでも仮説を立てるための道具であり完全である必要はない ※ メトリクスだけで仮説を立てられることはあるので必ずしもタイムラインは必須ではない © DMM 19
  7. タイムラインから仮説を立てる タイムラインを元に仮説を立てる 1. 5分間隔でレイテンシが悪化しており、同間隔で動作するバッチが負荷をかけている => バッチを改善する 2. 新規コネクションスパイクと一部連動しておりコネクション処理が負荷をかけている => ECからの接続を永続化する

    仮説が立たない、実際のタイムラインやメトリクスでは説明がつかないときは必要なメトリクスが不足し ていることが多い また複合要因の場合は想定した1つの原因と結果が必ずしも一致しないことがある 仮説は必ずしも1つである必要はなく、思いつくものを洗い出すと次策が手に入る © DMM 20
  8. レジリエンスを高める手法 © DMM Bulkhead Graceful Degradation リソースを分離して 障害の波及を防ぐ 手法 非重要機能を縮退

    し重要な機能を継 続させる手法 Webサーバーを分 けて振り分け、専用 DBレプリカを設け るなど 機能の非表示化や 直近キャッシュの 表示など Fail Fast 成功が見込めない 処理を早期に打ち 切り滞留を防ぐ手 法 適切なタイムアウト 設定や過負荷時の 早期拒否など 25