用語集 · パフォーマンス
ストレステスト(Stress Testing)
英語: Stress testing
別名: stress test, 限界テスト, ブレークポイントテスト, breakpoint testing
定義
想定を超える負荷をかけて限界点を見つけ、システムがどのように故障し、その後に復旧できるかを確認する性能テストです。
ストレステストは、意図的にシステムに想定以上の負荷を段階的にかけ、目標を満たせなくなるか完全に故障するまで追い込むテストです。負荷テストが「通常のピークに耐えられるか?」を問うのに対し、ストレステストは「どこまで耐えられるか、最初に何が壊れるか、そのときユーザーに何が起きるか?」を問います。
例(k6 の ramping arrival rate)
サーバーの応答速度に関係なく、リクエストレートを段階的に上げていきます。
import http from 'k6/http';
export const options = {
scenarios: {
breakpoint: {
executor: 'ramping-arrival-rate',
startRate: 50,
timeUnit: '1s',
preAllocatedVUs: 200,
maxVUs: 2000,
stages: [
{ duration: '5m', target: 200 },
{ duration: '5m', target: 400 },
{ duration: '5m', target: 800 },
{ duration: '3m', target: 0 }, // ramp down to observe recovery
],
},
},
};
export default function () {
http.get('https://staging.example.com/api/search?q=shoes');
}
arrival-rate 系の executor は、レスポンスが遅くなっても目標レートでリクエストを送り続けます。これは実際のユーザーに近く、仮想ユーザー数を固定する方式よりも飽和状態をはっきりと露呈させます。
観察すべきこと
- ニー(屈曲点)。 スループットが頭打ちになる一方で、レイテンシのパーセンタイルが急上昇し始めるレートです。これが実質的なキャパシティです。
- 故障のしかた。 グレースフルデグラデーションとは、すばやく
429や503を返して負荷を切り捨てることです。悪い故障とは、タイムアウト、ほかのサービスへの連鎖障害、データ破損、プロセスのクラッシュです。 - 復旧。 負荷を下げた後、レイテンシは自然に元に戻るでしょうか?それとも、詰まった接続や満杯のキューのせいで再起動が必要になるでしょうか?
- 最初のボトルネック。 CPU、データベース接続プール、スレッドプール、メモリ、または下流の依存サービスです。これを直すと限界点が移動するため、ストレステストは繰り返し行われることが多いです。
スパイクテストとの違い
ストレステストは負荷を徐々に上げて限界を見つけます。スパイクテストは、タイムセールやプッシュ通知のように通常負荷から非常に高い負荷へほぼ瞬時に跳ね上げ、オートスケーリングやキューが十分速く反応できるかを確認します。
よくある間違い
ほかのチームが依存している共有環境に対してストレステストを実行すること、サーバーより先に飽和してしまう単一の負荷生成マシンから実行すること、そしてどのように壊れたか、復旧したかを記録せずに「800 rps で壊れた」で終わらせてしまうことです。