菜单
开源

固定到达率

使用 constant-arrival-rate 执行器,k6 在指定时间内启动固定数量的迭代。它是一个开放模型执行器,这意味着迭代的启动独立于系统响应(详情请阅读 开放模型和封闭模型)。

只要有可用的 VU,该执行器就会以给定的速率持续启动迭代。执行迭代的时间可能因测试逻辑或被测系统的响应时间而异。为了弥补这一点,执行器会启动不同数量的 VU 来满足配置的迭代率。有关分配工作原理的说明,请阅读 到达率 VU 分配

注意

迭代启动是分时进行的。迭代不会在完全相同的时间启动。如果 rate10timeUnit1s,则每次迭代大约每十分之一秒(即每 100 毫秒)启动一次。

选项

除了通用配置选项外,此执行器还具有以下选项

选项类型描述默认值
duration(必需)字符串场景总持续时间(不包括 gracefulStop)。-
rate(必需)整数在每个 timeUnit 期间启动的迭代次数。-
preAllocatedVUs(必需)整数在测试开始前预分配的 VU 数量,用于保留运行时资源。-
timeUnit字符串应用 rate 值的时段。"1秒"
maxVUs整数测试运行期间允许的最大 VU 数量。如果未设置,则与 preAllocatedVUs 相同

何时使用

当您希望迭代保持恒定,不受被测系统性能影响时使用。例如,这种方法对于更准确地表示 RPS 非常有用。

注意

不要在迭代结束时放置 sleep。

到达率执行器已经通过 ratetimeUnit 属性来控制迭代速率。因此,在 VU 代码的末尾使用 sleep() 函数是不必要的。

示例

此示例安排了一个在 30 秒内每秒固定启动 30 次迭代的速率。它预分配 2 个 VU,并允许 k6 根据需要动态调度最多 50 个 VU。

JavaScript
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');
}

观察结果

下图描绘了示例脚本的性能

Ramping VUs

基于我们的测试场景输入和结果

  • 每 1 秒启动 30 次迭代的期望速率在测试的大部分时间里得以实现和保持。
  • 测试场景按照指定的 30 秒持续时间运行。
  • 在启动时只有 2 个 VU(由 preAllocatedVUs 选项指定),k6 会自动调整 VU 数量以达到期望的速率,最多不超过 maxVUs。对于此测试,最终达到 17 个 VU。
  • 实现期望速率所需的 VU 数量取决于每次迭代执行需要多长时间。对于此测试定义,如果执行时间恰好是 1 秒,则需要 30 个 VU。但是,由于执行时间少于 1 秒,因此需要较少的 VU。

preAllocatedVUs 设置得太低会缩短测试以期望速率运行的持续时间,因为需要持续分配资源以达到该速率。