到达率 VU 分配
在到达率执行器中,只要 k6 有可用的 VU,它就会根据您的目标速率开始迭代。设置迭代速率的能力伴随着一点配置复杂性:您必须预先分配足够的 VU。换句话说,在测试运行之前,您必须同时
- 配置负载(按每单位时间的新迭代次数)
- 确保您已分配了足够的 VU。
继续阅读,了解 k6 在到达率执行器中如何分配 VU。
注意
在云测试中,
preAllocatedVUs
会计入您的订阅额度。在规划测试时,考虑在本地机器上进行试运行初始化,以确保您高效地分配 VU。
到达率执行器中的预分配
作为开放模型场景,到达率执行器根据配置的速率开始迭代。例如,您可以配置到达率执行器每秒、每分钟或每小时开始 10 次迭代。这种行为与封闭模型场景相反,在封闭模型场景中,VU 会等待一次迭代完成后再开始另一次
每次迭代都需要一个 VU 来运行。因为 k6 VU 是单线程的,与其他 JavaScript 运行时一样,一个 VU 一次只能运行一次迭代(及其事件循环)。为确保您有足够的 VU,您必须预先分配足够的数量。
在您的到达率配置中,有三个属性决定迭代速率
- k6 在
timeUnit
(默认 1s) 内平均开始rate
次迭代。 preAllocatedVUs
设置要初始化以满足目标迭代速率的 VU 数量。
例如,对于 constant-arrival-rate
执行器和 rate: 10
,k6 尝试每 100 毫秒开始一次新的迭代。如果场景配置为 rate: 10, timeUnit: '1m'
,k6 尝试每 6 秒开始一次新的迭代。它是否能够开始目标迭代速率取决于分配的 VU 数量是否足够。
export const options = {
scenarios: {
constant_load: {
executor: 'constant-arrival-rate',
preAllocatedVUs: 10,
rate: 10,
timeUnit: '1m',
},
},
};
在实践中,确定能够达到目标迭代速率所需的正确 VU 数量可能需要一些尝试和错误,因为所需的 VU 完全取决于您的迭代代码是什么样的以及被测系统处理请求的速度。
k6 如何使用分配的 VU
在到达率场景开始之前,k6 首先初始化 preAllocatedVUs
的数量。当测试运行时,可用的 preAllocatedVUs
数量决定了 k6 可以开始多少次迭代。k6 尝试达到目标每秒迭代次数,此时会发生以下两种情况之一
如果执行器 | 则.. |
---|---|
拥有足够的 VU | 多余的 VU 处于“空闲”状态,可在需要时使用。 |
VU 不足。 | k6 会为无法运行的每次迭代发出一个 dropped_iterations 指标。 |
迭代持续时间影响必要的分配
必要的分配取决于迭代持续时间:持续时间越长,所需的 VU 越多。
在一个理想的世界里,您可以用这个公式估算预分配的 VU 数量
preAllocatedVUs = [median_iteration_duration * rate] + constant_for_variance
在现实世界中,如果您精确地知道一次迭代需要多长时间,您可能就不需要运行测试了。更重要的是,随着测试的进行,迭代持续时间可能会增加。如果响应时间变慢,导致 k6 缺少 VU 来按所需速率开始迭代,则分配可能不足,k6 将会丢弃迭代。
要确定您的策略,您可以在本地运行测试并逐步增加预分配的 VU 数量。由于丢弃的迭代也可能表明系统性能正在下降,这种早期实验本身就可以提供有用的数据。
您可能不需要 maxVUs
注意
在云测试中,
maxVUs
的数量会计入您的订阅额度,会覆盖preAllocatedVUs
设置的数量。
到达率执行器也有一个 maxVUs
属性。如果您设置了它,k6 将按此顺序运行
- 预分配
preAllocatedVUs
。 - 运行测试,尝试达到目标迭代速率。
- 如果目标超出可用 VU,则分配另一个 VU。
- 如果目标仍然超出可用 VU,则继续分配 VU,直到达到由
maxVUs
设置的数量。
尽管看起来很方便,但在大多数情况下应避免使用 maxVUs
。分配 VU 会产生 CPU 和内存成本,并且在测试运行时分配 VU 可能会使负载生成器过载并扭曲结果。在云测试中,maxVUs
的数量会计入您的订阅额度。这是因为 k6 必须为 maxVUs
分配足够的资源以进行初始化,即使它们从未被使用。在几乎所有情况下,最好的做法是提前预分配所需的 VU 数量。
在某些情况下使用 maxVUs
可能有意义,这些情况包括
- 在首次测试中确定必要的分配量
- 为预期测试所需的预分配 VU 增加一点“缓冲”
- 在需要随着 VU 增加而仔细扩展负载生成器的大型、高度分布式的测试中。
您无法保证哪个 VU 运行一次迭代
与所有执行器一样,您无法预测到达率执行器将使用哪个特定的 VU 进行特定的迭代。随着测试的进行,执行器可能会使用部分或全部已分配的 VU,即使它从未需要全部已分配的数量来达到迭代速率。