段階的なセットアップとランダウンを使用して、K6 で実行をセットアップしようとしています。ステージが完了したら実行の新しい反復を開始するように K6 をセットアップする方法を見つけようとしています。単純にステージ ブロックに繰り返しを含めるか、それとも他に何かする必要がありますか?
1 に答える
基本的に必要なのは、特定の一連のステージを長期間にわたって繰り返すことです。
次の 2 つの解決策があります。
bash/cmd/shell スクリプトのループでスクリプトを実行するだけです。k6 が再度初期化する必要があるため、実行の間に一時停止が発生します。さらに、複数の出力がありますが、これは悪くないかもしれません。以下を参照してください
ステージは必要な数だけ用意してください。手動で行うことも、テスト スクリプト内でスクリプトを作成することもできます。
import http from "k6/http";
import { check, sleep } from "k6";
let stages = [// total 30 seconds
// Ramp-up from 1 to 5 VUs in 10s
{ duration: "10s", target: 5 },
// Stay at rest on 5 VUs for 5s
{ duration: "5s" },
// Ramp-down from 5 to 0 in 15s
{ duration: "15s", target: 0}
];
let final_stages = [];
// 30 seconds by 120 seconds is 3600 seconds or 1 hour
for (let i =0 ;i < 120; i++) {
final_stages = final_stages.concat(stages)
}
export let options = {
stages: final_stages,
discardResponseBodies: true
};
export function setup() {
console.log(JSON.stringify(options.stages));
}
export default function(testStart) {
// normal execution
let res = http.get("http://httpbin.org/");
check(res, { "status is 200": (r) => r.status === 200 });
}
k6内でデータを収集するだけでメモリが不足する可能性があるため、実行時間が長くなる場合は、しきい値を使用し--no-summary
てk6 を実行することを強くお勧めします。--no-thresholds
これはおそらく、 influxdb や Load Impact の Insights などのメトリクス用にストレージを使用する必要があることを意味します。もちろん、これはあなたの場合には当てはまらないかもしれません-チェックする必要があります:)。
以前の質問を理解したとおりに回答します。「ステージが必要であり、別のステージで発生するように特定の期間ではなく、具体的な量のスクリプトの反復を実行したい」
簡単な答えはノーです。
ステージがある場合、テストの反復と期間は相互に排他的です。そのうちの 1 つだけが考慮されます。考えられる回避策については、最後を参照してください。
長い答え:
私が正しく理解していれば、あなたが望むのは、一連のステージを用意し、すべてのステージが実行された後に、特定の反復回数を実行するいくつかの VUS を作成することです。これは現在サポートされておらず、なぜこれが必要なのか、私たち (k6 チーム) にとって興味深いものです。
回避策:現在、私は 2 つの回避策を考えることができます - どちらもハッキーです:
- 後の反復でテストから何も必要ない場合は、2 つのテストを作成し、それらを次々に実行する bash/shell/cmd スクリプトを作成します。これにより、テスト実行の間に一時停止が発生し、2 つの出力が得られますが、間違いなく簡単になります。
- すべての反復を実行するのに十分な長さの期間ですべてのステージが終了したら、別のステージを作成します。テスト全体の開始を記録する変数を用意します-できればセットアップで、最終段階に到達したときに計算します。必要なだけ反復を実行してから、残りのテストのためにスリープします。
この時点では、VU 間で通信する方法がないことに注意することが重要です。そのため、10 個の VU がある場合、それぞれが 5 回実行して 50 回の反復を行い、1 つの VU がはるかに速くまたは遅く終了するか、またはそのようなことを決定する必要があります。それ。
これは明らかにあなたのケースに合わせて調整する必要があり、正確ではありませんが、もう一度やりたいこととその理由ははるかに興味深いものです。import http from "k6/http"; import { check, sleep } from "k6"; export let options = { stages: [ // Ramp-up from 1 to 5 VUs in 10s { duration: "10s", target: 5 }, // Stay at rest on 5 VUs for 5s { duration: "5s" }, // run for some amount of time after that { duration: "15s"} ], discardResponseBodies: true }; export function setup() { return Date.now(); } let iter = 5; // how many iteration per VU should be done in the iterations part export default function(testStart) { // 15ms is the amount of time for the pre iterations phase if (Date.now() - testStart > 15 * 1000) { // "iterations part" if (iter == 0) { // we have ran out of iterations to do sleep(15000) // sleep for the duration of the phase } iter = iter - 1; // debug log console.log(__VU, __ITER, iter); // the actual part you want to do let res = http.get("http://httpbin.org/"); check(res, { "status is 200": (r) => r.status === 200 }); } else { // normal execution let res = http.get("http://httpbin.org/"); check(res, { "status is 200": (r) => r.status === 200 }); } }
サイドノート:
到着率ベースの実行の議論中にこれが議論され、現在の計画はこれがサポートされる予定ですが、すべてをサポートするために必要な内部リファクタリングがたくさんあるため、この作業はおそらくアルファ/ベータ機能から少なくとも1か月かかります一緒に追加したいと思います。将来的に考慮されるように、おそらくユース ケースに関する問題を作成する必要があります。