固定到达率
使用 constant-arrival-rate
执行器,k6 在指定时间内启动固定数量的迭代。它是一个开放模型执行器,这意味着迭代的启动独立于系统响应(详情请阅读 开放模型和封闭模型)。
只要有可用的 VU,该执行器就会以给定的速率持续启动迭代。执行迭代的时间可能因测试逻辑或被测系统的响应时间而异。为了弥补这一点,执行器会启动不同数量的 VU 来满足配置的迭代率。有关分配工作原理的说明,请阅读 到达率 VU 分配。
注意
迭代启动是分时进行的。迭代不会在完全相同的时间启动。如果
rate
为10
,timeUnit
为1s
,则每次迭代大约每十分之一秒(即每 100 毫秒)启动一次。
选项
除了通用配置选项外,此执行器还具有以下选项
选项 | 类型 | 描述 | 默认值 |
---|---|---|---|
duration(必需) | 字符串 | 场景总持续时间(不包括 gracefulStop )。 | - |
rate(必需) | 整数 | 在每个 timeUnit 期间启动的迭代次数。 | - |
preAllocatedVUs(必需) | 整数 | 在测试开始前预分配的 VU 数量,用于保留运行时资源。 | - |
timeUnit | 字符串 | 应用 rate 值的时段。 | "1秒" |
maxVUs | 整数 | 测试运行期间允许的最大 VU 数量。 | 如果未设置,则与 preAllocatedVUs 相同 |
何时使用
当您希望迭代保持恒定,不受被测系统性能影响时使用。例如,这种方法对于更准确地表示 RPS 非常有用。
注意
不要在迭代结束时放置 sleep。
到达率执行器已经通过
rate
和timeUnit
属性来控制迭代速率。因此,在 VU 代码的末尾使用sleep()
函数是不必要的。
示例
此示例安排了一个在 30 秒内每秒固定启动 30 次迭代的速率。它预分配 2 个 VU,并允许 k6 根据需要动态调度最多 50 个 VU。
import http from 'k6/http';
export const options = {
discardResponseBodies: true,
scenarios: {
contacts: {
executor: 'constant-arrival-rate',
// How long the test lasts
duration: '30s',
// How many iterations per timeUnit
rate: 30,
// Start `rate` iterations per second
timeUnit: '1s',
// Pre-allocate 2 VUs before starting the test
preAllocatedVUs: 2,
// Spin up a maximum of 50 VUs to sustain the defined
// constant arrival rate.
maxVUs: 50,
},
},
};
export default function () {
http.get('https://test.k6.io/contacts.php');
}
观察结果
下图描绘了示例脚本的性能
基于我们的测试场景输入和结果
- 每 1 秒启动 30 次迭代的期望速率在测试的大部分时间里得以实现和保持。
- 测试场景按照指定的 30 秒持续时间运行。
- 在启动时只有 2 个 VU(由
preAllocatedVUs
选项指定),k6 会自动调整 VU 数量以达到期望的速率,最多不超过maxVUs
。对于此测试,最终达到 17 个 VU。 - 实现期望速率所需的 VU 数量取决于每次迭代执行需要多长时间。对于此测试定义,如果执行时间恰好是 1 秒,则需要 30 个 VU。但是,由于执行时间少于 1 秒,因此需要较少的 VU。
将
preAllocatedVUs
设置得太低会缩短测试以期望速率运行的持续时间,因为需要持续分配资源以达到该速率。