阶梯式增长 VU
使用 ramping-vus
执行器,可变数量的 VU 在指定时间内尽可能多地执行迭代。
要使用此执行器的快捷方式,请使用 stages 选项。
选项
除了通用配置选项外,此执行器还具有以下选项
选项 | 类型 | 描述 | 默认值 |
---|---|---|---|
stages(必需) | 数组 | 指定要增加或减少到的目标 VU 数量的对象数组。 | [] |
startVUs | 整数 | 测试开始时运行的 VU 数量。 | 1 |
gracefulRampDown | 字符串 | 在减少 VU 期间,等待已开始的迭代完成再停止它的时间。 | "30s" |
何时使用
如果您需要在特定时间段内增加或减少 VU,则此执行器非常适合。
示例
此示例安排了一个两阶段测试,在 20 秒内从 0 增加到 10 个 VU,然后在 10 秒内减少到 0 个 VU。
import http from 'k6/http';
import { sleep } from 'k6';
export const options = {
discardResponseBodies: true,
scenarios: {
contacts: {
executor: 'ramping-vus',
startVUs: 0,
stages: [
{ duration: '20s', target: 10 },
{ duration: '10s', target: 0 },
],
gracefulRampDown: '0s',
},
},
};
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);
}
注意
如果将
gracefulRampDown
设置为 0 秒,在减少阶段,某些迭代可能会被中断。
观察
以下图表描绘了示例脚本的性能
根据我们的测试场景输入和结果
- 配置定义了 2 个阶段,总测试持续时间为 30 秒;
- 阶段 1 在 20 秒内将 VU 从
startVUs
的 0 线性增加到目标 10; - 在阶段 1 结束时有 10 个 VU,然后阶段 2 在 10 秒内将 VU 线性减少到目标 0;
default
函数的每次迭代预计约为 515ms,即约 ~2 次/秒;- 随着 VU 数量的变化,迭代率直接相关;每个增加的 VU 会使速率增加约 2 次/秒,而每个减少的 VU 会使速率减少约 2 次/秒;
- 该示例在整个测试过程中执行了约 300 次迭代。
获取阶段索引
要获取当前运行阶段的索引,请使用 k6-jslib-utils 库中的 getCurrentStageIndex
助手函数。它返回一个从零开始的数字,等于 shortcut stages
数组或执行器 stages
数组中的位置。
import { getCurrentStageIndex } from 'https://jslib.k6.io/k6-utils/1.3.0/index.js';
export const options = {
stages: [
{ target: 10, duration: '30s' },
{ target: 50, duration: '1m' },
{ target: 10, duration: '30s' },
],
};
export default function () {
if (getCurrentStageIndex() === 1) {
console.log('Running the second stage where the expected target is 50');
}
}
使用此功能,可以自动使用当前运行的阶段进行标记。有关更多详细信息,请查看标记阶段部分。