菜单
开源

到达率 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 数量是否足够。

JavaScript
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 将按此顺序运行

  1. 预分配 preAllocatedVUs
  2. 运行测试,尝试达到目标迭代速率。
  3. 如果目标超出可用 VU,则分配另一个 VU。
  4. 如果目标仍然超出可用 VU,则继续分配 VU,直到达到由 maxVUs 设置的数量。

尽管看起来很方便,但在大多数情况下应避免使用 maxVUs。分配 VU 会产生 CPU 和内存成本,并且在测试运行时分配 VU 可能会使负载生成器过载并扭曲结果。在云测试中,maxVUs 的数量会计入您的订阅额度。这是因为 k6 必须为 maxVUs 分配足够的资源以进行初始化,即使它们从未被使用。在几乎所有情况下,最好的做法是提前预分配所需的 VU 数量。

在某些情况下使用 maxVUs 可能有意义,这些情况包括

  • 在首次测试中确定必要的分配量
  • 为预期测试所需的预分配 VU 增加一点“缓冲”
  • 在需要随着 VU 增加而仔细扩展负载生成器的大型、高度分布式的测试中。

您无法保证哪个 VU 运行一次迭代

与所有执行器一样,您无法预测到达率执行器将使用哪个特定的 VU 进行特定的迭代。随着测试的进行,执行器可能会使用部分或全部已分配的 VU,即使它从未需要全部已分配的数量来达到迭代速率。