用語集 · パフォーマンス
ソークテスト(耐久テスト)
英語: Soak testing
別名: soak test, 耐久テスト, エンデュランステスト, endurance testing
定義
現実的な通常負荷を何時間も維持し、メモリリークのように時間とともに蓄積して初めて現れる問題を明らかにする性能テストです。
ソークテスト(耐久テスト、エンデュランステストとも呼ばれます)は、通常レベルの負荷を長時間、一般的には数時間、場合によっては 1 日以上かけ続けるテストです。負荷自体は特別なものではなく、重要なのは継続時間です。多くの欠陥はゆっくりと進行するため、10 分間の負荷テストでは見えません。たとえば 1,000 リクエストごとに数メガバイトずつ漏れるメモリ、プールに返却されない接続、ディスクを埋め尽くしていくログファイルなどです。
見つけられるもの
- メモリリーク。 ヒープ使用量がじわじわと増え続け、ガベージコレクション後も下がらず、最終的にメモリ不足でクラッシュします。
- リソースの枯渇。 開かれたまま解放されないデータベース接続、ファイルハンドル、スレッド、ソケット。
- レイテンシの漸進的な悪化。 6 時間目の p95 が 1 時間目より明らかに悪くなります。キャッシュの肥大化、テーブルの膨張、断片化が原因であることが多いです。
- 定期ジョブとの干渉。 夜間バッチ、バックアップ、証明書の更新、ログローテーションが実トラフィックと衝突します。
- ストレージの増加。 ログ、一時ファイル、キューの滞留でディスクが埋まっていきます。
例(k6)
export const options = {
stages: [
{ duration: '10m', target: 80 },
{ duration: '8h', target: 80 },
{ duration: '10m', target: 0 },
],
thresholds: {
http_req_duration: ['p(95)<600'],
http_req_failed: ['rate<0.005'],
},
};
default 関数は、負荷テストで使うのと同じ現実的なユーザージャーニーです。違いは長い定常ステージだけです。
結果の読み方
ソークテストは合否のしきい値だけでなく、**傾向(トレンド)**で判断します。実行全体にわたって、メモリ、接続数、レイテンシのパーセンタイル、エラー率をグラフにします。平らな線なら合格です。右肩上がりの傾きは、たとえ何もクラッシュしないうちに実行が終わったとしても欠陥です。本番環境は 8 時間よりはるかに長く動き続けるからです。
よくある間違い
- ストレステスト並みの負荷でソークテストを行うこと。2 つの問いが混ざり、失敗の原因がわかりにくくなります。
- クライアント側の指標だけを見ること。リークはまずサーバーのメモリやプールのグラフに現れます。
- 実行中にサービスを再起動したりオートスケールで入れ替えたりする環境を使うこと。まさに探している蓄積が隠れてしまいます。
- 時間がかかるという理由で省略すること。やめるのではなく、夜間や週末にスケジュールしましょう。