こんにちは。よっしーです(^^)
今日は、k6 の Shared iterations についてご紹介します。
背景
Dockerで構築したWebアプリの開発環境において、k6のExecutorsについて調査したときの内容を備忘として残しました。
開発環境のソースは下記のリポジトリにあります。
shared-iterations
shared-iterations エグゼキューターは、イテレーションをVUの数で共有します。k6がすべてのイテレーションを実行した時点でテストが終了します。
このエグゼキューターを簡単に使用するには、vus および iterations オプションを使用できます。
注意: このエグゼキューターではイテレーションの均等な分配が保証されていないことに注意してください。より速く実行するVUは、遅いVUよりも多くのイテレーションを完了します。
特定のVUが特定の固定数のイテレーションを完了することを保証するには、per-VU iterations エグゼキューターを使用してください。
options
shared-iterations エグゼキューターには、一般的な設定オプションに加えて、以下のオプションがあります。
- vus (整数): 同時に実行するVUの数。デフォルトは1です。
- iterations (整数): すべてのVUで実行するスクリプトイテレーションの合計数。デフォルトは1です。
- maxDuration (文字列): シナリオが強制的に停止される前の最大シナリオの実行時間(gracefulStopを除く)。デフォルトは”10m”(10分)です。
これらのオプションを調整することで、テストの振る舞いをカスタマイズできます。
いつ使用するか
shared-iterations エグゼキューターは、特定のVUの数が固定数の合計イテレーションを完了する必要があり、VUごとのイテレーション数は重要ではない場合に適しています。テストイテレーションの数を完了するまでの時間が重要な場合、このエグゼキューターが最適です。
使用例として、開発ビルドサイクル内でのクイックパフォーマンステストが考えられます。開発者が変更を行うたびに、パフォーマンスの回帰をテストするためにテストをローカルのコードに対して実行するかもしれません。したがって、このエグゼキューターは、開発サイクルの初期段階でパフォーマンスをテストすることを重視するシフト・レフトポリシーと組み合わせてうまく機能します。この段階では、修正のコストが最も低いためです。
サンプル
以下の例では、合計200のイテレーションを10つのVUで共有し、最大テスト実行時間を30秒に設定しています。
import http from 'k6/http';
import { sleep } from 'k6';
export const options = {
discardResponseBodies: true,
scenarios: {
contacts: {
executor: 'shared-iterations',
vus: 10,
iterations: 200,
maxDuration: '30s',
},
},
};
export default function () {
http.get('https://test.k6.io/contacts.php');
// Injecting sleep
// Sleep time is 500ms. Total iteration time is sleep + time to finish request.
sleep(0.5);
}
観察
以下のグラフは、この例のスクリプトのパフォーマンスを表しています。
テストシナリオの入力と結果に基づいて次のような観察があります:
- テストはデフォルトの関数の固定数(200回のイテレーション)に制限されています。
- VU(仮想ユーザー)の数は10に固定され、テストが開始される前に初期化されます。
- デフォルト関数の各イテレーションは、おおよそ515ミリ秒かかり、約2回/秒実行されることが期待されます。
- 最大スループット(最高の効率)は、したがって約20イテレーション/秒と予想されます(2イテレーション/秒 * 10のVU)。
- 最大スループットはテストの大部分で維持されています。
- イテレーションの分布は偏っている可能性があります。一つのVUは50回のイテレーションを実行し、別のVUはたった10回しか実行しなかったかもしれません。
おわりに
今日は、k6 の Shared iterations についてご紹介しました。
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント