コンテンツにスキップ

フルログインフロー(Mail OTP)負荷テスト

テスト概要

項目詳細
テスト日2025年12月17日
対象フローMail OTPによる完全なOAuth 2.0ログイン
目的OTP検証を含むエンドツーエンドログインパフォーマンスを測定
シャーディングRegion Shards 32, Code Shards 8, Refresh Token 64

エグゼクティブサマリー

32シャード最適化により、前回テスト(12/13)で発生していたDOエラー・スパイクが完全に解消され、**150 LPS(Logins Per Second)**で安定動作を確認。

目標LPS完了フロー数成功率P50P95P99DO P99状態
50 LPS7,312100%587ms688ms748ms2,846ms⚠️ コールドスタート
100 LPS14,624100%570ms696ms753ms1,393ms✅ 良好
125 LPS18,232100%621ms761ms826ms1,153ms✅ 良好
150 LPS21,937100%639ms756ms853ms955ms✅ 優秀

12/13 vs 12/17 比較

メトリクス12/13 (16シャード)12/17 (32シャード)改善
100 LPS DOエラー443 (0.39%)0100%解消
150 LPS P953,015ms283ms91%短縮
150 LPS DO P991,648ms955ms42%短縮

テスト環境

K6 Cloud構成

パラメータ50 LPS100 LPS125 LPS150 LPS
Executorramping-arrival-rateramping-arrival-rateramping-arrival-rateramping-arrival-rate
テスト時間3分3分3分3分
プリアロケートVU200400500600
最大VU4006008001000
シードユーザー数500100012501500
Load Zoneamazon:us:portlandamazon:us:portlandamazon:us:portlandamazon:us:portland

シャード構成

Storeシャード数Generation
SessionStore32Gen 2
ChallengeStore32Gen 2
AuthCodeStore32Gen 2
RevocationStore32Gen 4
RefreshTokenRotator64Gen 4

テスト方法論

フルログインフロー(5ステップ)

flowchart LR
    A["1. AuthorizeInit
(GET /authorize)"] --> B["2. OTP Generate
(POST /email-code/generate)"] B --> C["3. OTP Verify
(POST /email-code/verify)"] C --> D["4. AuthorizeCode
(GET /authorize prompt=none)"] D --> E["5. Token
(POST /token)"]

各ステップの役割

  1. AuthorizeInit: OAuth 2.0認可リクエスト開始、ログインページ表示
  2. EmailCodeGenerate: OTPコード生成・保存(ChallengeStore)
  3. EmailCodeVerify: OTPコード検証・消費、セッション発行(SessionStore)
  4. AuthorizeCode: 認可コード発行(AuthCodeStore)
  5. Token: アクセストークン・IDトークン発行

成功判定

  • P95レイテンシ < 5,000ms
  • 成功率 > 95%

結果 - パフォーマンスメトリクス

50 LPSテスト

テスト期間: 2025-12-16T16:01:30Z - 16:06:30Z UTC

メトリクス
Worker総リクエスト数30,478
Worker P99 Duration46.7ms
DO総リクエスト数45,688
DOエラー0
DO Wall Time P992,846ms
D1 Read Queries1,143,239
D1 Write Queries28,478

⚠️ 注意: DO P99が高い。32シャードで50 LPSだと各シャードに1.56 req/sしか到達せず、コールドスタートが発生しやすい。

100 LPSテスト

テスト期間: 2025-12-16T16:09:00Z - 16:14:00Z UTC

メトリクス
Worker総リクエスト数59,761
Worker P99 Duration67.4ms
DO総リクエスト数89,531
DOエラー0
DO Wall Time P991,393ms
D1 Read Queries1,169,929
D1 Write Queries41,785

良好: DOエラー0件(12/13の443件から完全解消)

125 LPSテスト

テスト期間: 2025-12-16T16:15:50Z - 16:21:00Z UTC

メトリクス
Worker総リクエスト数74,176
Worker P99 Duration88.4ms
DO総リクエスト数111,184
DOエラー0
DO Wall Time P991,153ms
D1 Read Queries1,209,902
D1 Write Queries61,789

良好: DO Wall Time P99がさらに改善

150 LPSテスト

テスト期間: 2025-12-16T16:23:00Z - 16:28:00Z UTC

メトリクス
総リクエスト数89,000
HTTP Failures0
ピークRPS598 req/s
P95レスポンスタイム283ms
Worker P99 Duration69.2ms
DO総リクエスト数133,400
DOエラー0
DO Wall Time P99955ms
D1 Read Queries1,248,445
D1 Write Queries81,019

優秀: 全メトリクスで最良の結果。DO P99が1秒を切った。

ステップ別レイテンシ(150 LPS)

ステップCountAvgP50P95P99Max
AuthorizeInit21,937106ms103ms129ms173ms1,102ms
EmailCodeGenerate21,937217ms210ms279ms331ms1,202ms
EmailCodeVerify21,937260ms252ms336ms400ms2,627ms
AuthorizeCode21,93768ms63ms88ms104ms8,351ms
Full Flow21,937652ms639ms756ms853ms8,871ms

シャーディング分析

コールドスタート vs 負荷の関係

LPS各シャードへの負荷DO P99状態
501.56 req/s2,846ms⚠️ コールドスタート頻発
1003.13 req/s1,393ms✅ 安定
1253.91 req/s1,153ms✅ 安定
1504.69 req/s955ms✅ 最適

発見: 各シャードに3 req/s以上の負荷がかかると安定する

32シャード最適化効果

メトリクス12/13 (16シャード)12/17 (32シャード)
K6 P953,015ms283ms
Worker P99365ms69ms
DO P991,648ms955ms
DOエラー20
成功率99.97%100%

キャパシティ推奨

負荷レベルLPS月間ログイン数想定サービス規模
低負荷~50~130M中小規模(16シャード推奨)
標準負荷~100~260M中規模サービス
推奨上限~150~390M大規模サービス
限界負荷200+520M+未テスト

ユーザー規模換算

1ログイン = 5 HTTPリクエストとして計算:

  • 150 LPS × 5 = 750 RPS(HTTPリクエスト換算)
  • 月間3.9億ログイン = 月間約1,950万アクティブユーザー(週1ログイン想定)
  • 月間3.9億ログイン = 月間約1,300万アクティブユーザー(月3回ログイン想定)

主要な発見

1. 32シャードで全問題解消

  • DOエラー: 443 → 0(100%解消)
  • P95: 3,015ms → 283ms(91%短縮)
  • スパイク: あり(30秒超) → なし

2. 高負荷ほどDOパフォーマンス向上

反直感的だが、負荷が上がるとDO P99が改善

  • 50 LPS: 2,846ms(コールドスタート)
  • 150 LPS: 955ms(ウォームシャード)

3. Workerは効率を維持

Worker P99は150 LPSでも100ms未満を維持。

4. EmailCodeVerifyが最も遅いステップ

260ms平均(フロー全体の40%)、このステップは以下を含む:

  • OTP検証
  • セッション作成
  • 複数のDO操作

パフォーマンス可視化

負荷別DO Wall Time P99

xychart-beta
    title "DO Wall Time P99 (ms) - 高負荷ほど改善"
    x-axis ["50 LPS", "100 LPS", "125 LPS", "150 LPS"]
    y-axis "レイテンシ (ms)" 0 --> 3000
    bar [2846, 1393, 1153, 955]
LPSDO P99状態備考
502,846ms⚠️コールドスタート頻発
1001,393ms安定
1251,153ms安定
150955ms最適

反直感的な発見: 負荷が上がるとDO Wall Timeが改善(コールドスタート減少による)

ボトルネック分析

レイヤー50 LPS100 LPS125 LPS150 LPS
Worker P9947ms67ms88ms69ms
DO P992,846ms ⚠️1,393ms1,153ms955ms ✅
K6 P95688ms696ms761ms756ms
判定コールドスタート良好良好最適

残存課題

1. 低負荷時のコールドスタート

50 LPSでは各シャードに1.56 req/sしか到達せず、コールドスタートが発生。

対策:

  • 低負荷環境では16シャードに減らす
  • ウォームアップ時間を延長

2. DO P99の変動

P99は負荷によって955ms〜2,846msと変動。

対策:

  • 予想負荷に応じた適切なシャード数選択
  • 動的シャード調整(将来課題)

結論

32シャード最適化により、フルログインフローは:

  • **150 LPS(月間約3.9億ログイン)**で安定パフォーマンスを達成
  • 全テストレベルで100%成功率
  • DOエラー解消(443 → 0)
  • P95を91%短縮(3,015ms → 283ms)

主要な改善:

  • DOエラー: 443 → 0(100%解消)
  • P95レイテンシ: 3,015ms → 283ms(91%短縮)
  • DO Wall Time P99: 1,648ms → 955ms(42%短縮)

低負荷時(50 LPS以下)のコールドスタート問題は、予想トラフィックに応じてシャード数を調整することで対応可能です。