負荷テスト

システムに大量のリクエストを送り、性能限界やボトルネックを特定するテスト手法

テストパフォーマンス

負荷テストとは

負荷テスト (Load Testing) は、システムに大量のリクエストを送り、性能限界やボトルネックを特定するテスト手法である。本番トラフィックを模擬し、レスポンスタイム、スループット、エラー率を測定する。

テストの種類

種類 目的 パターン
負荷テスト 想定負荷での性能確認 一定の負荷を維持
ストレステスト 限界値の特定 負荷を段階的に増加
スパイクテスト 急激な負荷増への耐性 突然の負荷急増
耐久テスト 長時間稼働の安定性 一定負荷を長時間維持

k6 での負荷テスト

import http from 'k6/http';
import { check, sleep } from 'k6';

export const options = {
  stages: [
    { duration: '1m', target: 50 },   // 1分で50ユーザーまで増加
    { duration: '3m', target: 50 },   // 3分間50ユーザーを維持
    { duration: '1m', target: 0 },    // 1分で0に減少
  ],
  thresholds: {
    http_req_duration: ['p(95)<500'],  // 95%タイルが500ms以下
    http_req_failed: ['rate<0.01'],    // エラー率1%以下
  },
};

export default function () {
  const res = http.get('https://api.example.com/users');
  check(res, { 'status is 200': (r) => r.status === 200 });
  sleep(1);
}

ツール比較

ツール 言語 特徴
k6 JavaScript 軽量、CI/CD 統合が容易
Artillery YAML/JS AWS Lambda での分散実行
Locust Python リアルタイムダッシュボード
JMeter Java GUI、プロトコル対応が豊富

Lambda + API Gateway の負荷テスト

確認すべき項目は、コールドスタート (初回リクエストのレイテンシ)、同時実行数 (Lambda のデフォルト上限 1,000)、API Gateway スロットリング (429 エラーの発生率)、DynamoDB スロットリング (ProvisionedThroughputExceededException) である。

よくあるボトルネック

DB 接続数の枯渇はタイムアウトとして現れ、RDS Proxy やコネクションプーリングで対策する。Lambda 同時実行の上限は 429 エラーを引き起こし、上限引き上げ申請で対応する。DynamoDB の WCU 不足はスロットリングを起こし、オンデマンドモードで解消する。API Gateway のスロットリングは設定の調整で対応する。

理論と実装の両面から学ぶなら関連書籍が参考になる。

関連用語