こんにちは。よっしーです(^^)
今日は、k6におけるScenariosについてご紹介します。
背景
Dockerで構築したWebアプリの開発環境において、k6のScenariosについて調査したときの内容を備忘として残しました。
開発環境のソースは下記のリポジトリにあります。
シナリオ
「シナリオ」は、VU(仮想ユーザー)とイテレーションのスケジュールを詳細に設定する方法です。シナリオを使用すると、さまざまなワークロードや負荷テストでのトラフィックパターンをモデル化できます。
シナリオを使用する利点は次のとおりです:
- より簡単で柔軟なテストの組織化。同じスクリプト内で複数のシナリオを宣言でき、それぞれが異なるJavaScript関数を独立して実行できます。
- よりリアルなトラフィックのシミュレーション。各シナリオは、専用のエグゼキューターによって駆動される異なるVUとイテレーションのスケジューリングパターンを使用できます。
- 並行または直列のワークロード。シナリオは互いに独立して並行して実行されますが、各シナリオのstartTimeプロパティを注意深く設定することで直列に見せることもできます。
- 詳細な結果の分析。異なる環境変数とメトリックタグをシナリオごとに設定できます。
シナリオの設定方法
シナリオを設定するには、オプションオブジェクト内の”scenarios”キーを使用します。各スクリプト内のシナリオ名が一意である限り、シナリオに任意の名前を付けることができます。
シナリオ名は結果の要約、タグなどに表示されます。
export const options = {
scenarios: {
example_scenario: {
// name of the executor to use
executor: 'shared-iterations',
// common scenario configuration
startTime: '10s',
gracefulStop: '5s',
env: { EXAMPLEVAR: 'testing' },
tags: { example_tag: 'testing' },
// executor-specific configuration
vus: 10,
iterations: 200,
maxDuration: '10s',
},
another_scenario: {
/*...*/
},
},
};
シナリオエグゼキューター
各k6シナリオに対して、VUのワークロードはエグゼキューターによってスケジュールされます。エグゼキューターは、テストの実行時間、トラフィックが一定か変動するか、そしてワークロードがVUまたは到着率(つまりオープンまたはクローズドモデル)でモデル化されるかを構成します。
シナリオオブジェクトは、事前定義されたエグゼキューター名の1つを持つexecutorプロパティを定義する必要があります。エグゼキューターの選択は、k6がどのように負荷をモデル化するかを決定します。選択肢には以下が含まれます:
- イテレーションの数によるもの。
- shared-iterations:イテレーションをVU間で共有します。
- per-vu-iterations:各VUが構成されたイテレーションを実行します。
- VUの数によるもの。
- constant-VUs:一定の数のVUを送信します。
- ramping-vus:構成された段階に従ってVUの数を増減させます。
- イテレーションレートによるもの。
- constant-arrival-rate:一定のレートでイテレーションを開始します。
- ramping-arrival-rate:構成された段階に従ってイテレーションレートを増減させます。
一般的なシナリオオプションに加えて、各エグゼキューターオブジェクトには、そのワークロードに固有の追加オプションがあります。詳細なリストについては、後日、「Executors」の記事にします。
シナリオオプション
- executor(必須) string 一意のエグゼキューター名。エグゼキューターの可能な値のリストについては、後日記事にする「executors」を参照してください。デフォルト:-
- startTime string テストの開始からの時間オフセットで、このシナリオが実行を開始する時点。デフォルト: “0s”
- gracefulStop string イテレーションの実行が強制停止される前に、実行中のイテレーションが終了するのを待つための時間。詳細については「Graceful stop」を読んでください。 デフォルト:”30s”
- exec string 実行するエクスポートされたJS関数の名前。 デフォルト:”default”
- env object このシナリオに特有の環境変数。 デフォルト:{}
- tags object このシナリオに特有のタグ。 デフォルト:{}
サンプル
以下は、シーケンスを持つ2つのシナリオを組み合わせたスクリプトの例です:
- shared_iter_scenarioはすぐに開始されます。10のVUはできるだけ早く100のイテレーションを使用しようとします(一部のVUは他のVUよりも多くのイテレーションを使用する場合があります)。
- per_vu_scenarioは10秒後に開始します。この場合、10のVUがそれぞれ10のイテレーションを実行します。
どのシナリオがより長い時間がかかるでしょうか?実行して調べることができます。また、1つまたは両方のシナリオにmaxDurationプロパティを追加することもできます。
import http from "k6/http";
export const options = {
scenarios: {
shared_iter_scenario: {
executor: "shared-iterations",
vus: 10,
iterations: 100,
startTime: "0s",
},
per_vu_scenario: {
executor: "per-vu-iterations",
vus: 10,
iterations: 10,
startTime: "10s",
},
},
};
export default function () {
http.get("https://test.k6.io/");
}
スクリプトをシナリオと共に実行する場合、k6の出力には各シナリオに関する高レベルな情報が含まれます。例えば、前述のスクリプトを実行する場合、k6 run scenario-example.js
を実行すると、k6は以下のようにシナリオを報告します:
execution: local
script: scenario-example.js
output: -
scenarios: (100.00%) 2 scenarios, 20 max VUs, 10m40s max duration (incl. grace
ful stop):
* shared_iter_scenario: 100 iterations shared among 10 VUs (maxDurati
on: 10m0s, gracefulStop: 30s)
* per_vu_scenario: 10 iterations for each of 10 VUs (maxDuration: 10m
0s, startTime: 10s, gracefulStop: 30s)
完全な出力には、デフォルトのテスト終了サマリーと同様に、サマリー メトリクスが含まれています。
/\ |‾‾| /‾‾/ /‾‾/
/\ / \ | |/ / / /
/ \/ \ | ( / ‾‾\
/ \ | |\ \ | (‾) |
/ __________ \ |__| \__\ \_____/ .io
execution: local
script: scenario-example.js
output: -
scenarios: (100.00%) 2 scenarios, 20 max VUs, 10m40s max duration (incl. grace
ful stop):
* shared_iter_scenario: 100 iterations shared among 10 VUs (maxDurati
on: 10m0s, gracefulStop: 30s)
* per_vu_scenario: 10 iterations for each of 10 VUs (maxDuration: 10m
0s, startTime: 10s, gracefulStop: 30s)
running (00m12.8s), 00/20 VUs, 200 complete and 0 interrupted iterations
shared_iter_scenario ✓ [ 100% ] 10 VUs 00m02.7s/10m0s 100/100 shared iters
per_vu_scenario ✓ [ 100% ] 10 VUs 00m02.8s/10m0s 100/100 iters, 10 per V
data_received..................: 2.4 MB 188 kB/s
data_sent......................: 26 kB 2.1 kB/s
http_req_blocked...............: avg=64.26ms min=1.56µs med=8.28µs max
=710.86ms p(90)=57.63ms p(95)=582.36ms
http_req_connecting............: avg=28.6ms min=0s med=0s max
=365.92ms p(90)=20.38ms p(95)=224.44ms
http_req_duration..............: avg=204.25ms min=169.55ms med=204.36ms max
=407.95ms p(90)=205.96ms p(95)=239.32ms
{ expected_response:true }...: avg=204.25ms min=169.55ms med=204.36ms max
=407.95ms p(90)=205.96ms p(95)=239.32ms
http_req_failed................: 0.00% ✓ 0 ✗ 200
http_req_receiving.............: avg=195.54µs min=53.87µs med=162.55µs max
=1.52ms p(90)=260.6µs p(95)=317.89µs
http_req_sending...............: avg=38.16µs min=7.61µs med=37.99µs max
=167.54µs p(90)=50.16µs p(95)=60.18µs
http_req_tls_handshaking.......: avg=24.03ms min=0s med=0s max
=274.05ms p(90)=20.81ms p(95)=212.74m
http_req_waiting...............: avg=204.01ms min=169.32ms med=204.11ms max
=407.82ms p(90)=205.74ms p(95)=239.01ms
http_reqs......................: 200 15.593759/s
iteration_duration.............: avg=268.83ms min=169.78ms med=204.67ms max
=952.85ms p(90)=444.97ms p(95)=786.52ms
iterations.....................: 200 15.593759/s
vus............................: 10 min=0 max=10
vus_max........................: 20 min=20 max=20
おわりに
今日は、k6におけるScenariosについてご紹介しました。
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント