よっしー
こんにちは。よっしーです(^^)
今日は、k6 のPer VU iterations についてご紹介します。
背景
Dockerで構築したWebアプリの開発環境において、k6のExecutorsについて調査したときの内容を備忘として残しました。
開発環境のソースは下記のリポジトリにあります。
Per VU iterations
「Per VU iterations」について、各VUは正確な回数のイテレーションを実行します。完了したイテレーションの合計数は、vus(Virtual Userの数) * iterations(イテレーション数)に等しいです。
options
オプション 一般的な設定オプションに加えて、このエグゼキュータには以下のオプションがあります。
オプション | タイプ | 説明 | デフォルト値 |
---|---|---|---|
vus | 整数 | 同時に実行するVUの数 | 1 |
iterations | 整数 | 各VUが実行するexec関数のイテレーション数 | 1 |
maxDuration | 文字列 | 強制停止される前の最大シナリオ実行時間(gracefulStopを除く) | “10m” |
いつ使用するか
このエグゼキュータを使用すると、特定の数のVUが同じ数のイテレーションを完了する必要がある場合に便利です。これは、VU間でパーティションを作成したい固定のテストデータセットがある場合に役立ちます。
サンプル
以下の例では、10つのVUがそれぞれ20回のイテレーションを実行するようにスケジュールされています。テストは合計で200回のイテレーションを実行し、最大の実行時間は30秒です。
import http from 'k6/http';
import { sleep } from 'k6';
export const options = {
discardResponseBodies: true,
scenarios: {
contacts: {
executor: 'per-vu-iterations',
vus: 10,
iterations: 20,
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);
}
観察
以下のグラフは、この例のスクリプトのパフォーマンスを表しています。
テストシナリオの入力と結果に基づいて以下のポイントが考えられます:
- VUの数は10で固定され、テストが開始される前に初期化されます。
- 合計のイテレーション数は1つのVUあたり20回で固定されており、つまり合計で200回のイテレーションが実行されます(10つのVU * 各20回のイテレーション)。
- デフォルトの関数の各イテレーションは約515ミリ秒(おおよそ2回/秒)かかると予想されています。
- 最大スループット(最高効率)は、したがって約20回/秒であると予想されます(2回/秒 * 10のVU)。
- 最大スループットは達成されますが、維持されません。
- イテレーションの分布が均等なため、速いVUは早めに終了し、テストの残りの時間はアイドル状態になり、効率が低下します。
- 合計の実行時間は、効率の低さにより共有イテレーションよりもわずかに長い、9秒です。
- 全体のテストの実行時間は、最も遅いVUが20のリクエストを完了するのにかかる時間と同じくらい長くなります。
おわりに
今日は、k6 の Per VU iterations についてご紹介しました。
よっしー
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント