フルログインフロー(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 | 完了フロー数 | 成功率 | P50 | P95 | P99 | DO P99 | 状態 |
|---|---|---|---|---|---|---|---|
| 50 LPS | 7,312 | 100% | 587ms | 688ms | 748ms | 2,846ms | ⚠️ コールドスタート |
| 100 LPS | 14,624 | 100% | 570ms | 696ms | 753ms | 1,393ms | ✅ 良好 |
| 125 LPS | 18,232 | 100% | 621ms | 761ms | 826ms | 1,153ms | ✅ 良好 |
| 150 LPS | 21,937 | 100% | 639ms | 756ms | 853ms | 955ms | ✅ 優秀 |
12/13 vs 12/17 比較
| メトリクス | 12/13 (16シャード) | 12/17 (32シャード) | 改善 |
|---|---|---|---|
| 100 LPS DOエラー | 443 (0.39%) | 0 | 100%解消 |
| 150 LPS P95 | 3,015ms | 283ms | 91%短縮 |
| 150 LPS DO P99 | 1,648ms | 955ms | 42%短縮 |
テスト環境
K6 Cloud構成
| パラメータ | 50 LPS | 100 LPS | 125 LPS | 150 LPS |
|---|---|---|---|---|
| Executor | ramping-arrival-rate | ramping-arrival-rate | ramping-arrival-rate | ramping-arrival-rate |
| テスト時間 | 3分 | 3分 | 3分 | 3分 |
| プリアロケートVU | 200 | 400 | 500 | 600 |
| 最大VU | 400 | 600 | 800 | 1000 |
| シードユーザー数 | 500 | 1000 | 1250 | 1500 |
| Load Zone | amazon:us:portland | amazon:us:portland | amazon:us:portland | amazon:us:portland |
シャード構成
| Store | シャード数 | Generation |
|---|---|---|
| SessionStore | 32 | Gen 2 |
| ChallengeStore | 32 | Gen 2 |
| AuthCodeStore | 32 | Gen 2 |
| RevocationStore | 32 | Gen 4 |
| RefreshTokenRotator | 64 | Gen 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)"]
各ステップの役割
- AuthorizeInit: OAuth 2.0認可リクエスト開始、ログインページ表示
- EmailCodeGenerate: OTPコード生成・保存(ChallengeStore)
- EmailCodeVerify: OTPコード検証・消費、セッション発行(SessionStore)
- AuthorizeCode: 認可コード発行(AuthCodeStore)
- Token: アクセストークン・IDトークン発行
成功判定
- P95レイテンシ < 5,000ms
- 成功率 > 95%
結果 - パフォーマンスメトリクス
50 LPSテスト
テスト期間: 2025-12-16T16:01:30Z - 16:06:30Z UTC
| メトリクス | 値 |
|---|---|
| Worker総リクエスト数 | 30,478 |
| Worker P99 Duration | 46.7ms |
| DO総リクエスト数 | 45,688 |
| DOエラー | 0 |
| DO Wall Time P99 | 2,846ms |
| D1 Read Queries | 1,143,239 |
| D1 Write Queries | 28,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 Duration | 67.4ms |
| DO総リクエスト数 | 89,531 |
| DOエラー | 0 |
| DO Wall Time P99 | 1,393ms |
| D1 Read Queries | 1,169,929 |
| D1 Write Queries | 41,785 |
✅ 良好: DOエラー0件(12/13の443件から完全解消)
125 LPSテスト
テスト期間: 2025-12-16T16:15:50Z - 16:21:00Z UTC
| メトリクス | 値 |
|---|---|
| Worker総リクエスト数 | 74,176 |
| Worker P99 Duration | 88.4ms |
| DO総リクエスト数 | 111,184 |
| DOエラー | 0 |
| DO Wall Time P99 | 1,153ms |
| D1 Read Queries | 1,209,902 |
| D1 Write Queries | 61,789 |
✅ 良好: DO Wall Time P99がさらに改善
150 LPSテスト
テスト期間: 2025-12-16T16:23:00Z - 16:28:00Z UTC
| メトリクス | 値 |
|---|---|
| 総リクエスト数 | 89,000 |
| HTTP Failures | 0 |
| ピークRPS | 598 req/s |
| P95レスポンスタイム | 283ms |
| Worker P99 Duration | 69.2ms |
| DO総リクエスト数 | 133,400 |
| DOエラー | 0 |
| DO Wall Time P99 | 955ms |
| D1 Read Queries | 1,248,445 |
| D1 Write Queries | 81,019 |
✅ 優秀: 全メトリクスで最良の結果。DO P99が1秒を切った。
ステップ別レイテンシ(150 LPS)
| ステップ | Count | Avg | P50 | P95 | P99 | Max |
|---|---|---|---|---|---|---|
| AuthorizeInit | 21,937 | 106ms | 103ms | 129ms | 173ms | 1,102ms |
| EmailCodeGenerate | 21,937 | 217ms | 210ms | 279ms | 331ms | 1,202ms |
| EmailCodeVerify | 21,937 | 260ms | 252ms | 336ms | 400ms | 2,627ms |
| AuthorizeCode | 21,937 | 68ms | 63ms | 88ms | 104ms | 8,351ms |
| Full Flow | 21,937 | 652ms | 639ms | 756ms | 853ms | 8,871ms |
シャーディング分析
コールドスタート vs 負荷の関係
| LPS | 各シャードへの負荷 | DO P99 | 状態 |
|---|---|---|---|
| 50 | 1.56 req/s | 2,846ms | ⚠️ コールドスタート頻発 |
| 100 | 3.13 req/s | 1,393ms | ✅ 安定 |
| 125 | 3.91 req/s | 1,153ms | ✅ 安定 |
| 150 | 4.69 req/s | 955ms | ✅ 最適 |
発見: 各シャードに3 req/s以上の負荷がかかると安定する
32シャード最適化効果
| メトリクス | 12/13 (16シャード) | 12/17 (32シャード) |
|---|---|---|
| K6 P95 | 3,015ms | 283ms |
| Worker P99 | 365ms | 69ms |
| DO P99 | 1,648ms | 955ms |
| DOエラー | 2 | 0 |
| 成功率 | 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]
| LPS | DO P99 | 状態 | 備考 |
|---|---|---|---|
| 50 | 2,846ms | ⚠️ | コールドスタート頻発 |
| 100 | 1,393ms | ✅ | 安定 |
| 125 | 1,153ms | ✅ | 安定 |
| 150 | 955ms | ✅ | 最適 |
反直感的な発見: 負荷が上がるとDO Wall Timeが改善(コールドスタート減少による)
ボトルネック分析
| レイヤー | 50 LPS | 100 LPS | 125 LPS | 150 LPS |
|---|---|---|---|---|
| Worker P99 | 47ms | 67ms | 88ms | 69ms |
| DO P99 | 2,846ms ⚠️ | 1,393ms | 1,153ms | 955ms ✅ |
| K6 P95 | 688ms | 696ms | 761ms | 756ms |
| 判定 | コールドスタート | 良好 | 良好 | 最適 |
残存課題
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以下)のコールドスタート問題は、予想トラフィックに応じてシャード数を調整することで対応可能です。