用語集 · パフォーマンス
負荷テスト(Load Testing)
英語: Load testing
別名: load test, ロードテスト, 負荷試験
定義
想定される実際のトラフィックをシステムにかけ、応答時間・エラー率・スループットが合意した目標を満たすかを確認する性能テストです。
負荷テストは、実際に想定しているトラフィック(一般的には通常時のピーク負荷)をシステムにかけ、その振る舞いを測定するテストです。測るのはレイテンシのパーセンタイル、エラー率、スループット、リソース使用量です。答えるべき問いは「計画している負荷のもとで性能目標を満たしているか?」であり、システムを壊すことが目的ではありません。それはストレステストの役割です。
例(k6)
import http from 'k6/http';
import { check, sleep } from 'k6';
export const options = {
stages: [
{ duration: '2m', target: 100 }, // ramp up to 100 virtual users
{ duration: '10m', target: 100 }, // hold at expected peak
{ duration: '1m', target: 0 }, // ramp down
],
thresholds: {
http_req_duration: ['p(95)<500', 'p(99)<1200'],
http_req_failed: ['rate<0.01'],
},
};
export default function () {
const res = http.get('https://staging.example.com/api/products');
check(res, { 'status is 200': (r) => r.status === 200 });
sleep(1); // think time between iterations
}
いずれかのしきい値(threshold)を超えると k6 は 0 以外の終了コードで終了するため、同じスクリプトを CI のゲートとしてそのまま使えます。
負荷・ストレス・ソーク・スパイク
| 種類 | 負荷のかけ方 | 答える問い |
|---|---|---|
| 負荷(Load) | 想定ピークを一定時間維持 | 通常のピーク時に目標を満たしているか? |
| ストレス(Stress) | 想定を超えて段階的に増加 | どこで、どのように壊れるか?復旧できるか? |
| ソーク(Soak) | 通常負荷を数時間継続 | 時間とともに劣化しないか(メモリリーク、プール枯渇)? |
| スパイク(Spike) | 急増した後に急減 | 突発的な負荷に耐え、元の規模に戻れるか? |
正しく実施するためのポイント
- 実際のトラフィックをモデル化する。 1 つの URL をループで叩き続けるのではなく、本番のアクセス解析で見られるエンドポイントの構成比、ペイロードサイズ、思考時間(think time)を再現します。
- 本番相当の環境を使う。 スペック不足のステージング環境で得た結果は、その環境についてしか教えてくれません。
- 平均ではなくパーセンタイルで判断する。 平均値は、ユーザーが実際に不満を感じる遅いテール部分を隠してしまいます。
- サーバー側も監視する。 CPU、メモリ、データベース接続数、キューの深さを見れば、レイテンシが変化した理由がわかります。
- 目標を先に合意する。 「毎秒 200 リクエストで p95 が 500 ms 未満」のような明確な目標がなければ、負荷テストは数値を出すだけで合否の判定ができません。