1

段階的なセットアップとランダウンを使用して、K6 で実行をセットアップしようとしています。ステージが完了したら実行の新しい反復を開始するように K6 をセットアップする方法を見つけようとしています。単純にステージ ブロックに繰り返しを含めるか、それとも他に何かする必要がありますか?

4

1 に答える 1

1

基本的に必要なのは、特定の一連のステージを長期間にわたって繰り返すことです。

次の 2 つの解決策があります。

  1. bash/cmd/shell スクリプトのループでスクリプトを実行するだけです。k6 が再度初期化する必要があるため、実行の間に一時停止が発生します。さらに、複数の出力がありますが、これは悪くないかもしれません。以下を参照してください

  2. ステージは必要な数だけ用意してください。手動で行うことも、テスト スクリプト内でスクリプトを作成することもできます。

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 つの回避策を考えることができます - どちらもハッキーです:

  1. 後の反復でテストから何も必要ない場合は、2 つのテストを作成し、それらを次々に実行する bash/shell/cmd スクリプトを作成します。これにより、テスト実行の間に一時停止が発生し、2 つの出力が得られますが、間違いなく簡単になります。
  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か月かかります一緒に追加したいと思います。将来的に考慮されるように、おそらくユース ケースに関する問題を作成する必要があります。

于 2019-01-09T15:44:11.203 に答える