こんにちは。よっしーです(^^)
今日は、k6 の Constant arrival rate についてご紹介します。
背景
Dockerで構築したWebアプリの開発環境において、k6のExecutorsについて調査したときの内容を備忘として残しました。
開発環境のソースは下記のリポジトリにあります。
Constant arrival rate
“constant-arrival-rate executor”を使用すると、k6は指定された一定期間内に固定数のイテレーションを開始します。これはオープンモデルのエグゼキュータであり、システムの応答にかかわらずイテレーションが独立して開始されることを意味します(詳細はオープンモデルとクローズドモデルを参照)。
このエグゼキュータは、VUが利用可能である限り、指定されたレートでイテレーションを開始し続けます。イテレーションの実行時間はテストロジックやシステムの応答時間によって変動する可能性があります。これを補うために、エグゼキュータは設定されたイテレーションレートに達するためにさまざまな数のVUを開始します。アロケーションの動作についての詳細については、”Arrival-rate VU allocation”を参照してください。
注意
イテレーションの開始は小数点以下の間隔で行われます。 イテレーションはまったく同時に開始されるわけではありません。 timeUnit が 1 秒のレート 10 では、各イテレーションは約 10 分の 1 秒ごと (つまり、100 ミリ秒ごと) に開始されます。
options
オプション 一般的な設定オプションに加えて、このエグゼキュータには以下のオプションがあります。
以下は、”constant-arrival-rate executor”のオプションとその説明です。
オプション | タイプ | 説明 | デフォルト値 |
---|---|---|---|
duration (必須) | 文字列 | シナリオの合計実行時間(gracefulStopを除く) | – |
rate (必須) | 整数 | 各timeUnit期間中に開始するイテレーションの数 | – |
preAllocatedVUs (必須) | 整数 | テスト開始前にランタイムリソースを保持するために事前に割り当てるVUの数 | – |
timeUnit | 文字列 | rate値を適用する時間の単位 | “1s” |
maxVUs | 整数 | テスト実行中に許可される最大のVU数。未設定の場合、preAllocatedVUsと同じ | – |
いつ使用するか
“constant-arrival-rate executor”を使用すると、システムのパフォーマンスに関係なくイテレーションを一定に保ちたい場合に役立ちます。このアプローチは、RPS(Requests Per Second、1秒間のリクエスト数)などのより正確な表現に適しています。
注意
イテレーションの最後にsleepを配置しないでください。
到着レートエグゼキュータはすでにrateとtimeUnitプロパティを介してイテレーションレートを調整しているため、VUコードの最後にsleep()関数を使用する必要はありません。
サンプル
この例では、30秒間にわたって1秒あたり30回のイテレーションを一定のレートでスケジュールします。k6は必要に応じて動的に使用するために50のVUを割り当てます。
import http from 'k6/http';
export const options = {
discardResponseBodies: true,
scenarios: {
contacts: {
executor: 'constant-arrival-rate',
// How long the test lasts
duration: '30s',
// How many iterations per timeUnit
rate: 30,
// Start `rate` iterations per second
timeUnit: '1s',
// Pre-allocate VUs
preAllocatedVUs: 50,
},
},
};
export default function () {
http.get('https://test.k6.io/contacts.php');
}
“gracefulRampDown”を0秒に設定すると、ランプダウンの段階で一部のイテレーションが中断される可能性があります。このオプションを0秒に設定すると、ランプダウン中に既に開始されたイテレーションが直ちに停止されるため、中断が発生する可能性があります。必要に応じて、イテレーションの完了を待つ時間を設定することで、中断を回避できます。
観察
以下のグラフは、この例のスクリプトのパフォーマンスを表しています。
テストシナリオの入力と結果に基づいて以下のポイントが考えられます:
- 1秒ごとに30回のイテレーションを開始するという目標のレートが、テストの大部分で達成され、維持されました。
- テストシナリオは指定された30秒間実行されました。
- preAllocatedVUsオプションで指定された2つのVUから始まり、k6は必要なレートを達成するためにVUの数を自動的に調整しました。このテストでは、最終的に17のVUが使用されました。
- 合計で900回のイテレーションが開始されました(30秒 * 30回/s)。
preAllocatedVUsの設定が低すぎると、リソースを割り当てるために継続的に割り当てる必要があるため、目標のレートでのテストの実行時間が短縮される可能性があります。
おわりに
今日は、k6 の Constant arrival rate についてご紹介しました。
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント