こんにちは。よっしーです(^^)
今日は、k6 Scenarios のGraceful stopについてご紹介します。
背景
Dockerで構築したWebアプリの開発環境において、k6のScenariosについて調査したときの内容を備忘として残しました。
開発環境のソースは下記のリポジトリにあります。
シナリオのコンセプト
シナリオとその実行者の基本的な概念がどのように機能するかについて説明しています。
異なるシナリオの設定は、生成される負荷、利用されるリソース、および発行されるメトリクスなど、システムのさまざまな側面に影響を与える可能性があります。シナリオの動作について少し知っていると、より良いテストを設計し、テスト結果を理解するのに役立ちます。
- オープンモデルとクローズドモデル:k6がVU(仮想ユーザー)をスケジュールするさまざまな方法、それらがテスト結果に及ぼす影響、およびk6が到達率エグゼキューターでオープンモデルをどのように実装しているかについての情報です。
- Graceful Stop:テストが予定の時間を終えた後、イテレーションを終了または段階的に減少させるための構成可能な期間についての情報です。
- 到達率VUの割り当て:k6が到達率エグゼキューターでVUを割り当てる方法についての情報です。
- ドロップされたイテレーション:k6が予定されたイテレーションを削除する可能性がある理由についての情報です。
この記事では、Graceful Stop について記載しています。
Graceful Stop
GracefulStopは、k6が進行中のイテレーションを完了させるためにテストの最後に設けられる期間です。
テストには設定された期間やランプダウンがある場合、k6は進行中のイテレーションを中断する可能性があります。これらの中断は、歪んだメトリクスや予期しないテスト結果を引き起こす可能性があります。この問題に対処するために、k6のシナリオにはgracefulStopというオプションがあります。ramping-vusエグゼキューターの場合、関連するオプションであるgracefulRampDownが存在し、VUの数が減少するにつれてVUが完了するのを待たせます。
gracefulStopオプションは、外部制御型以外のすべてのエグゼキューターで利用可能です。これは、k6がイテレーションを強制的に中断する前に待機する期間を指定します。デフォルト値は30秒です。
import http from 'k6/http';
export const options = {
discardResponseBodies: true,
scenarios: {
contacts: {
executor: 'constant-vus',
vus: 100,
duration: '10s',
gracefulStop: '3s',
},
},
};
export default function () {
const delay = Math.floor(Math.random() * 5) + 1;
http.get(`https://httpbin.test.k6.io/delay/${delay}`);
}
このスクリプトを実行すると、次のような結果になります。
running (13.0s), 000/100 VUs, 349 complete and 23 interrupted iterations
contacts ✓ [======================================] 100 VUs 10s
注意:合計テストの期間は10秒ですが、gracefulStopの影響で実際の実行時間は13秒になり、VUに進行中のイテレーションを完了するために追加の3秒が与えられました。現在進行中の23のイテレーションはこのウィンドウ内で完了しなかったため、中断されました。
gracefulRampDown
gracefulStopに加えて、ramping-vusエグゼキューターにはgracefulRampDownもあります。
ステージの対象値が前のステージの対象値よりも低い場合、k6は前のステージで開始されたいくつかのVUを停止する必要があるかもしれません。gracefulRampDownオプションは、k6がそれらのVUを中断する前に、それらのVUが現在完了するのにどれくらいの時間がかかるかを制御します。
gracefulRampDownの動作を把握するために、次のスクリプトをk6 run –verboseと共に実行できます。このスクリプトでは、イテレーションのスリープ時間がgracefulRampdown時間を超えています。したがって、k6は2番目のステージの対象に達するためにVUを強制的に中断する必要があります。–verboseフラグを使用すると、VUが開始されるとき、Graceful Stopに入るとき、強制的に中断されるときにコンソールにログが表示されます。
import http from "k6/http";
import { sleep } from "k6";
export const options = {
discardresponsebodies: true,
scenarios: {
contacts: {
executor: "ramping-vus",
startvus: 0,
stages: [
{ duration: "10s", target: 10 },
{ duration: "10s", target: 0 },
],
gracefulRampDown: "1s",
},
},
};
export default function () {
http.get("https://test.k6.io/contacts.php");
// 反復がランプダウンより長くなるようにスリープを超えて追加します
sleep(5);
}
おわりに
今日は、k6 Scenarios のGraceful stopについてご紹介しました。
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント