k6入門:Stress testing について

スポンサーリンク
k6入門:Stress testing について 環境構築
k6入門:Stress testing について
この記事は約6分で読めます。
よっしー
よっしー

こんにちは。よっしーです(^^)

今日は、Stress testing についてご紹介します。

スポンサーリンク

背景

Dockerで構築したWebアプリの開発環境において、k6を利用した負荷テストについて調査したときの内容を備忘として残しました。

開発環境のソースは下記のリポジトリにあります。

ストレステスト(Stress testing)

ストレステストは、通常よりも負荷が重い場合にシステムがどのように振る舞うかを評価します。

ストレステストの負荷パターンは平均負荷テストに似ていますが、主な違いは負荷が高いことです。高負荷を考慮するために、負荷の増加に比例してランプアップ期間が長くなります。同様に、テストが目標の負荷に達した後、平均負荷テストよりもわずかに長く続くことがあります。

つまり、ストレステストでは通常の負荷よりも高い負荷をかけ、システムがその負荷にどのように対処するかを評価します。これにより、システムの耐久性や限界を理解し、異常な状況においても正常に機能する能力をテストすることができます。

テストに関する会話によっては、ストレス テストがラッシュアワー テスト、サージ テスト、またはスケール テストと呼ばれることもあります。

ストレステストを実行するタイミング

ストレステストは、システムが重い負荷下での安定性と信頼性を検証します。システムは通常ではない状況で通常よりも高い負荷を受けることがあります。例えば、プロセスの締め切り、給与支払い日、ラッシュアワー、週末の終わりなど、通常よりも高いトラフィックが頻繁に発生する可能性のあるさまざまな状況が考えられます。

ストレステストは、これらの異常な状況においてもシステムが正常に機能し、パフォーマンスを維持できるかどうかを確認するために行われます。これにより、システムの信頼性を高め、予測できない高負荷の状況にも対応できるようになります。ストレステストは、システムが予想外の負荷に耐えるための優れた手段です。

考慮事項

ストレステストを実行する際には、以下の点に注意してください:

  1. 負荷は、システムが通常経験する負荷よりも高くする必要があります。ストレステストのデフォルトの目標がある場合(例:通常の負荷を50%または100%増加させるなど)、固定されたパーセンテージはありません。負荷は、システムがストレスフルな状況に対応しなければならない場合に依存します。時には通常の負荷からわずか数パーセント増加することもありますし、他の場合では50%から100%以上増加することもあります。一部のストレスフルな状況では、通常の負荷よりも2倍、3倍、または桁違いに高いこともあります。
  2. ストレステストは平均負荷テストの後に実行するより困難なテストを試みる前に、平均負荷テストの下でパフォーマンスの問題を特定してください。このシーケンスは重要です。
  3. 平均負荷テストのスクリプトを再利用する平均負荷テストのスクリプトを再利用し、負荷や仮想ユーザー(VUs)のパラメータを変更します。
  4. 平均負荷と比較してパフォーマンスが悪化することを期待するこのテストは、余分な負荷によるパフォーマンスの劣化度合いと、システムがそれを生き延びるかどうかを評価します。優れたパフォーマンスを発揮するシステムは、長時間にわたって一定のワークロードを処理する際に一貫した応答時間を示すはずです。

ストレステストは、システムの耐久性と限界を理解し、予測できない高負荷の状況に対処できるようにするために重要です。

Stress testing in k6

ストレステストの負荷は、平均負荷テストの負荷に類似していますが、負荷レベルが高くなります。ストレステストの負荷を設定する一般的な手順は以下の通りです:

  1. スクリプトの活動を、より高いユーザー数またはスループットに達するまで、ゆっくりとしたランプアップで増加させます。
  2. その負荷を一定期間維持します。
  3. テストケースに応じて、テストを停止するか徐々にランプダウンさせます。

このプロセスにより、システムが通常の平均を超える負荷にどのように対応するかが評価されます。高い負荷に対してどの程度パフォーマンスが維持されるか、またシステムがその状況を乗り越えるかどうかがテストされます。ストレステストは、システムの強度と信頼性を確認するための重要な手法です。

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

export const options = {
  // Key configurations for Stress in this section
  stages: [
    { duration: '10m', target: 200 }, // traffic ramp-up from 1 to a higher 200 users over 10 minutes.
    { duration: '30m', target: 200 }, // stay at higher 200 users for 30 minutes
    { duration: '5m', target: 0 }, // ramp-down to 0 users
  ],
};

export default () => {
  const urlRes = http.get('https://test-api.k6.io');
  sleep(1);
  // MORE STEPS
  // Here you can have more steps or complex script
  // Step1
  // Step2
  // etc.
};

ストレス テストの VU またはスループット グラフは次のようになります。

平均負荷テストと同様に、ストレステストも0から始まり、平均負荷テストでテストされたポイントを超えて増加します。ランプアップ期間とランプダウン期間はより長く設定され、より現実的な応答を可能にします。

注意:ストレステストは、スモークテストと平均負荷テストの後に実行してください。このテストタイプを早めに実行すると、低い負荷や平均利用率以下の負荷で問題が発生した場合、問題を特定するのが難しくなる可能性があります。したがって、スモークテストと平均負荷テストが成功した場合にのみ、ストレステストを実行することをお勧めします。これにより、システムのパフォーマンスと信頼性をより効果的に評価できます。

結果の分析

平均負荷テストと同様に、ストレステストの初期結果は、負荷が平均利用率を超えて増加する際の応答時間の劣化を特定するために、ランプアップ期間中に表示されます。一般的に、パフォーマンスが低下し、システムの安定性さえも崩れることがあるため、システムを平均負荷テスト以上に押し詰めると問題が発生します。

一定の負荷下で、システムのパフォーマンスとリソース消費が高負荷でも安定しているかどうかを確認することは重要です。

今度は、システムが卓越した負荷イベントを処理できることがわかったので、通常、チームはシステムが長時間にわたって正常に機能するかどうかを確認するために、浸漬テスト(Soak test)を実行します。

おわりに

今日は、Stress testingについてご紹介しました。

よっしー
よっしー

何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。

それでは、また明日お会いしましょう(^^)

コメント

タイトルとURLをコピーしました