負荷テスト実践シミュレーション
実際に負荷をかけた際に何を見て、どう判断し、どこをチューニングするか。シナリオ形式で追体験しながら学びます。
前提: シナリオ設計の原則 を読んでから本ドキュメントを読むと、より理解が深まります。
シナリオ設定
あなたはトークン発行APIの性能改善を担当することになりました。
状況:
- 本番リリース前の性能検証フェーズ
- 目標: 1000 req/s で P99 < 500ms
- 環境: EKS + Aurora (ステージング環境)
対象エンドポイント:
POST /oauth/token
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials
&client_id=test-client
&client_secret=test-secret
Phase 0: まず素朴にテストを作ってみる
0.1 最初のシナリオ
「とりあえず動くもの」を作ってみました。
// k6-first-attempt.js
import http from 'k6/http';
import { check, sleep } from 'k6';
export const options = {
stages: [
{ duration: '30s', target: 50 },
{ duration: '2m', target: 100 },
{ duration: '30s', target: 0 },
],
};
export default function () {
const res = http.post('https://staging.example.com/oauth/token', {
grant_type: 'client_credentials',
client_id: 'test-client', // ← 毎回同じ
client_secret: 'test-secret', // ← 毎回同じ
});
check(res, {
'status is 200': (r) => r.status === 200,
});
sleep(0.1); // ← 100ms固定
}
0.2 このシナリオの問題点
┌─────────────────────────────────────────────────────────────────────────────┐
│ このシナリオで測定できるもの/できないもの │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ ✅ 測定できる: │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ ・単一APIの処理性能の傾向 │ │
│ │ ・明らかなボトルネック(DB接続枯渇、CPU飽和など) │ │
│ │ ・改善前後の相対比較 │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │
│ ❌ 測定できない(本番と乖離する): │
│ ┌─────────────────────────────────────────────────────────────────────┐ │
│ │ ・実際のスループット上限 │ │
│ │ → 同じclient_idでキャッシュ100%ヒット │ │
│ │ → 本番より良い結果が出てしまう │ │
│ │ │ │
│ │ ・現実的な負荷パターン │ │
│ │ → Think Time 100ms固定は短すぎる │ │
│ │ → 実際のユーザーは数秒間隔で操作する │ │
│ │ │ │
│ │ ・システム全体の性能 │ │
│ │ → 単一エンドポイントのみ │ │
│ │ → 認可フローや他のAPIとの組み合わせが見えない │ │
│ └─────────────────────────────────────────────────────────────────────┘ │
│ │
│ このシナリオでも「ボトルネック特定」には使える │
│ → まずはこれで進めて、問題点を体感しながら学ぶ │
│ │
└─────────────────────────────────────────────────────────────────────────────┘
判断: シナリオの限界を理解した上で、まずはボトルネック特定の練習として進める
Phase 1: ベースライン計測
1.1 負荷テストの実行
まず現状を把握するために、軽い負荷から始めます。
k6 run k6-first-attempt.js
1.2 結果の確認
✓ status is 200
checks.........................: 100.00% ✓ 12000 ✗ 0
http_req_duration..............: avg=89ms min=15ms med=65ms max=1.2s p(90)=180ms p(95)=250ms p(99)=450ms
http_reqs......................: 12000 100/s