逐渐增加到达率
使用 ramping-arrival-rate
执行器,k6 以可变速率启动迭代。它是一个开放模型执行器,这意味着迭代的启动独立于系统响应(有关详细信息,请阅读开放模型和封闭模型)。
这个执行器有用于配置目标迭代次数和 k6 达到或保持在该目标所需时间的阶段(stages)。与逐渐增加 VU 数执行器配置 VU 不同,此执行器动态地改变要启动的迭代次数,并在测试有足够的分配 VU 时启动这些迭代。要了解分配的工作原理,请阅读到达率 VU 分配。
注意
迭代启动是分散的。迭代不会在同一时间精确启动。在
rate
为10
且timeUnit
为1s
时,每次迭代大约每十分之一秒(即每 100 毫秒)启动一次。
选项
除了常用配置选项外,此执行器还有以下选项
选项 | 类型 | 描述 | 默认值 |
---|---|---|---|
stages(必需) | 数组 | 对象数组,指定逐渐增加或减少到的目标迭代次数。 | [] |
preAllocatedVUs(必需) | 整数 | 测试开始前预分配的 VU 数量,以保留运行时资源。 | - |
startRate | 整数 | 测试开始时,每个 timeUnit 周期内执行的迭代次数。 | 0 |
timeUnit | 字符串 | 将 startRate 应用于 stages 的 target 值的时期。其值在整个场景持续时间内是恒定的,无法为特定阶段更改。 | "1s" |
maxVUs | 整数 | 测试运行期间允许的最大 VU 数量。 | 如果未设置,则与 preAllocatedVUs 相同。 |
何时使用
如果您需要独立于被测系统性能启动迭代,并希望在特定时间段内逐渐增加或减少迭代次数。
注意
不要在迭代结束时添加 sleep。 到达率执行器已经通过
rate
和timeUnit
属性控制迭代速率。在 VU 代码结束时使用sleep()
函数是没有必要的。
示例
这是一个四阶段测试的示例。
它从定义的 startRate
开始,即每分钟 300 次迭代,持续一分钟。一分钟后,迭代速率在接下来的两分钟内逐渐增加到每分钟 600 次迭代的目标,并在此速率上保持四分钟。在最后两分钟内,它逐渐下降到每分钟 60 次迭代的目标。
import http from 'k6/http';
export const options = {
discardResponseBodies: true,
scenarios: {
contacts: {
executor: 'ramping-arrival-rate',
// Start iterations per `timeUnit`
startRate: 300,
// Start `startRate` iterations per minute
timeUnit: '1m',
// Pre-allocate necessary VUs.
preAllocatedVUs: 50,
stages: [
// Start 300 iterations per `timeUnit` for the first minute.
{ target: 300, duration: '1m' },
// Linearly ramp-up to starting 600 iterations per `timeUnit` over the following two minutes.
{ target: 600, duration: '2m' },
// Continue starting 600 iterations per `timeUnit` for the following four minutes.
{ target: 600, duration: '4m' },
// Linearly ramp-down to starting 60 iterations per `timeUnit` over the last two minutes.
{ target: 60, duration: '2m' },
],
},
},
};
export default function () {
http.get('https://test.k6.io/contacts.php');
}
观察结果
下图描述了示例脚本的性能
基于我们的测试场景输入和结果
- 配置定义了 4 个阶段,总测试持续时间为 9 分钟。
- 阶段 1 在 1 分钟内保持
startRate
迭代速率为每分钟 300 次迭代。 - 阶段 2 在 2 分钟内将迭代速率从阶段 1 的每分钟 300 次迭代线性增加到每分钟 600 次迭代的目标。
- 阶段 3 在 4 分钟内保持阶段 2 的迭代速率为每分钟 600 次迭代。
- 阶段 4 在最后两分钟内将迭代速率线性下降到每分钟 60 次迭代的目标速率。
- 迭代速率的变化由 k6 通过调整 VU 数量来执行。
- 脚本会等待一段时间(由
gracefulStop
选项定义),直到迭代完成。在gracefulStop
期间,它不会启动新的迭代。 - 我们的示例在测试过程中执行了 4020 次迭代。
获取阶段索引
要获取当前运行阶段的索引,请使用来自 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');
}
}
使用此功能,可以自动标记当前运行的阶段。请查看标记阶段部分了解更多详细信息。