菜单
开源

逐渐增加到达率

使用 ramping-arrival-rate 执行器,k6 以可变速率启动迭代。它是一个开放模型执行器,这意味着迭代的启动独立于系统响应(有关详细信息,请阅读开放模型和封闭模型)。

这个执行器有用于配置目标迭代次数和 k6 达到或保持在该目标所需时间的阶段(stages)。与逐渐增加 VU 数执行器配置 VU 不同,此执行器动态地改变要启动的迭代次数,并在测试有足够的分配 VU 时启动这些迭代。要了解分配的工作原理,请阅读到达率 VU 分配

注意

迭代启动是分散的。迭代不会在同一时间精确启动。在 rate10timeUnit1s 时,每次迭代大约每十分之一秒(即每 100 毫秒)启动一次。

选项

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

选项类型描述默认值
stages(必需)数组对象数组,指定逐渐增加或减少到的目标迭代次数。[]
preAllocatedVUs(必需)整数测试开始前预分配的 VU 数量,以保留运行时资源。-
startRate整数测试开始时,每个 timeUnit 周期内执行的迭代次数。0
timeUnit字符串startRate 应用于 stagestarget 值的时期。其值在整个场景持续时间内是恒定的,无法为特定阶段更改。"1s"
maxVUs整数测试运行期间允许的最大 VU 数量。如果未设置,则与 preAllocatedVUs 相同。

何时使用

如果您需要独立于被测系统性能启动迭代,并希望在特定时间段内逐渐增加或减少迭代次数。

注意

不要在迭代结束时添加 sleep。 到达率执行器已经通过 ratetimeUnit 属性控制迭代速率。在 VU 代码结束时使用 sleep() 函数是没有必要的。

示例

这是一个四阶段测试的示例。

它从定义的 startRate 开始,即每分钟 300 次迭代,持续一分钟。一分钟后,迭代速率在接下来的两分钟内逐渐增加到每分钟 600 次迭代的目标,并在此速率上保持四分钟。在最后两分钟内,它逐渐下降到每分钟 60 次迭代的目标。

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

观察结果

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

Ramping Arrival Rate

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

  • 配置定义了 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 数组中的位置。

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

使用此功能,可以自动标记当前运行的阶段。请查看标记阶段部分了解更多详细信息。