負荷テスト
システムに大量のリクエストを送り、性能限界やボトルネックを特定するテスト手法
テストパフォーマンス
負荷テストとは
負荷テスト (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 のスロットリングは設定の調整で対応する。
理論と実装の両面から学ぶなら関連書籍が参考になる。