こんにちは。よっしーです(^^)
今日は、k6 Scenarios のVU到達率についてご紹介します。
背景
Dockerで構築したWebアプリの開発環境において、k6のScenariosについて調査したときの内容を備忘として残しました。
開発環境のソースは下記のリポジトリにあります。
シナリオのコンセプト
シナリオとその実行者の基本的な概念がどのように機能するかについて説明しています。
異なるシナリオの設定は、生成される負荷、利用されるリソース、および発行されるメトリクスなど、システムのさまざまな側面に影響を与える可能性があります。シナリオの動作について少し知っていると、より良いテストを設計し、テスト結果を理解するのに役立ちます。
- オープンモデルとクローズドモデル:k6がVU(仮想ユーザー)をスケジュールするさまざまな方法、それらがテスト結果に及ぼす影響、およびk6が到達率エグゼキューターでオープンモデルをどのように実装しているかについての情報です。
- Graceful Stop:テストが予定の時間を終えた後、イテレーションを終了または段階的に減少させるための構成可能な期間についての情報です。
- 到達率VUの割り当て:k6が到達率エグゼキューターでVUを割り当てる方法についての情報です。
- ドロップされたイテレーション:k6が予定されたイテレーションを削除する可能性がある理由についての情報です。
この記事では、到達率VUの割り当て について記載しています。
到達率VUの割り当て
到達率エグゼキューターでは、k6にVUが利用可能である限り、目標のレートに従ってイテレーションを開始します。イテレーションレートを設定できる能力は、少し複雑な構成が必要です。つまり、十分な数のVUを事前に割り当てる必要があります。言い換えれば、テストを実行する前に次の2つのことを行う必要があります:
- ロードを構成する(単位時間あたりの新しいイテレーション数)
- 十分な数のVUを割り当てることを確認する
到達率エグゼキューターでk6がどのようにVUを割り当てるかについて記載しています。
注意:クラウドテストでは、事前割り当てされたVUの数がサブスクリプションに対してカウントされます。テストを計画する際に、VUを効率的に割り当てていることを確認するために、ローカルマシンでトライアルの初期化を行うことを検討してください。
到達率エグゼキューターでの事前割り当て
到達率エグゼキューターは、設定されたレートに従ってイテレーションを開始します。たとえば、到達率エグゼキューターを構成して、1秒ごと、1分ごと、1時間ごとに10のイテレーションを開始するように設定できます。この動作は、クローズドモデルのシナリオとは対照的であり、VUは別のイテレーションを開始する前に前のイテレーションが終了するのを待つ必要があります。
各イテレーションには実行するためのVUが必要です。k6のVUは他のJavaScriptランタイムと同様にシングルスレッドですので、VUは一度に1つのイテレーション(およびそのイベントループ)しか実行できません。十分な数を確保するためには、事前に十分な数のVUを割り当てる必要があります。
到達率の設定では、イテレーションレートを決定するために3つのプロパティがあります:
- k6はrateの数だけtimeUnit(デフォルトは1秒)に均等にイテレーションを開始します。
- preAllocatedVUsは、目標のイテレーションレートを満たすために初期化するVUの数を設定します。
たとえば、constant-arrival-rateエグゼキューターでrate: 10を設定した場合、k6は新しいイテレーションを100ミリ秒ごとに開始しようとします。シナリオにrate: 10、timeUnit: ‘1m’がある場合、k6は新しいイテレーションを6秒ごとに開始しようとします。目標のイテレーションレートを達成できるかどうかは、割り当てられたVUの数に依存します。
export const options = {
scenarios: {
constant_load: {
executor: "constant-arrival-rate",
preAllocatedVUs: 10,
rate: 10,
timeUnit: "1m",
},
},
};
実際には、目標のイテレーションレートに到達するために必要な正確なVUの数を決定することは、試行錯誤が必要な場合があります。必要なVUの数は、イテレーションのコードの内容と、テスト対象のシステムがリクエストを処理する速度に完全に依存します。
イテレーションコードが要求をどのくらい速く処理できるか、テストシナリオがどのように設定されているか、対象のシステムの性能やリソースにも影響されます。したがって、適切なVU数を見つけるためには、実際のテスト実行やベンチマークを通じて実験して調整することが一般的です。テストの性能や効率を向上させるために、継続的な調整とベンチマーキングが重要です。
k6が割り当てられたVUをどのように使用するか
到達率シナリオが開始される前に、k6はまずpreAllocatedVUsの数を初期化します。テストが実行されると、利用可能なpreAllocatedVUsの数が、k6が開始できるイテレーションの数を決定します。k6は目標の秒間イテレーション数に到達しようとし、2つのことが起こり得ます:
- VUsの数が目標イテレーションレートを満たすのに十分な場合:この場合、k6は目標レートに到達するようにイテレーションを開始し続けます。新しいVUのイテレーションを開始して、目標のレートを維持しようとします。
- VUsの数が目標イテレーションレートを満たすには不十分な場合:この場合、k6は可能な限り多くのイテレーションを開始しようとしますが、目標レートに到達できない可能性があります。VUが足りない場合、k6はできるだけ多くのイテレーションを開始し、割り当てられたVUsが利用可能な範囲でできる限り多くの作業を行います。
簡単に言えば、割り当てられたVUsの数が、k6が同時に実行できるイテレーションの数を制御し、目標のイテレーションレートに到達しようとしますが、すべての場合に到達するとは限らないことを意味します。そのため、適切なVUの数を見つけるためには、テスト実行や調整が必要です。
エグゼキューターに十分なVUがある場合、余分なVUは「アイドル」状態であり、必要なときに使用できる状態です。
エグゼキューターに不十分なVUがある場合、k6は実行できない各イテレーションに対して「dropped_iterations」メトリクスを生成します。このメトリクスは、実行できなかったイテレーションの数を追跡するために使用されます。つまり、目標のイテレーションレートに到達できない場合、実行できなかったイテレーションが記録されます。
イテレーション期間の影響
イテレーションの期間は必要な割り当てに影響を与えます。より長い期間のイテレーションにはより多くのVUが必要です。
理想的な状況では、次の式を使用して事前割り当てVUの数を推定できるでしょう:
preAllocatedVUs = [median_iteration_duration * rate] + constant_for_variance
現実の世界では、イテレーションがどのくらい時間がかかるかを正確に知っている場合、テストを実行する必要はほとんどありません。さらに、テストが進行するにつれて、イテレーションの期間は通常増加します。応答時間が遅くなり、k6が目標のレートでイテレーションを開始するためのVUが不足するほど、割り当てが不足している可能性があり、k6はイテレーションをドロップすることがあります。
戦略を決定するために、テストをローカルで実行し、徐々に事前割り当てVUを追加してみることができます。ドロップされたイテレーションは、システムのパフォーマンスが低下していることを示すこともあるため、この初期の実験は有用なデータを提供できる可能性があります。
maxVUsについて
通常、ほとんどの場合でmaxVUsは必要ありません。
注意:クラウドテストでは、maxVUsの数がサブスクリプションに対してカウントされ、preAllocatedVUsで設定された数をオーバーライドします。
到達率エグゼキューターにもmaxVUsプロパティがあります。これを設定すると、k6は次のシーケンスで実行されます:
- preAllocatedVUsを事前に割り当てます。
- テストを実行し、目標のイテレーションレートに到達しようとします。
- 目標が利用可能なVUsを超える場合、別のVUを割り当てます。
- 目標が利用可能なVUsを依然超える場合、maxVUsで設定した数に達するまでVUを割り当て続けます。
maxVUsを使用することは便利に思えるかもしれませんが、ほとんどの場合、使用を避けるべきです。VUの割り当てにはCPUとメモリのコストがかかり、テストが実行されるときにVUを割り当てると、ロードジェネレーターに負荷がかかり、結果が歪む可能性があります。クラウドテストでは、maxVUsの数がサブスクリプションに対してカウントされます。これは、k6がmaxVUsが初期化されなくても、maxVUsのために十分なリソースを割り当てる必要があるためです。ほとんどの場合、最良の方法は必要なVUの数を事前に割り当てることです。
maxVUsを使用する意味がある場合は以下のような場合です:
- 初めてのテストで必要な割り当てを決定するため
- テストが必要とすると予想される事前割り当てのVUに少し余裕を持たせるため
- 巨大で高度に分散されたテストで、VUを増やすにつれてロードジェネレーターを注意深くスケーリングする必要がある場合。
どの VU が反復を実行するかは保証できません
すべてのエグゼキューターと同様に、到達率エグゼキューターが特定のイテレーションに使用する具体的なVUを予測することはできません。テストが実行されると、エグゼキューターは割り当てられたVUのいくつかまたはすべてを使用するかもしれません。これは、イテレーションレートに到達するために割り当てられた数全体が必要でない場合でも、発生する可能性があります。
おわりに
今日は、k6 Scenarios のVU到達率についてご紹介しました。
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント