菜单
开源

阶梯式增长 VU

使用 ramping-vus 执行器,可变数量的 VU 在指定时间内尽可能多地执行迭代。

要使用此执行器的快捷方式,请使用 stages 选项。

选项

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

选项类型描述默认值
stages(必需)数组指定要增加或减少到的目标 VU 数量的对象数组。[]
startVUs整数测试开始时运行的 VU 数量。1
gracefulRampDown字符串在减少 VU 期间,等待已开始的迭代完成再停止它的时间。"30s"

何时使用

如果您需要在特定时间段内增加或减少 VU,则此执行器非常适合。

示例

此示例安排了一个两阶段测试,在 20 秒内从 0 增加到 10 个 VU,然后在 10 秒内减少到 0 个 VU。

JavaScript
import http from 'k6/http';
import { sleep } from 'k6';

export const options = {
  discardResponseBodies: true,
  scenarios: {
    contacts: {
      executor: 'ramping-vus',
      startVUs: 0,
      stages: [
        { duration: '20s', target: 10 },
        { duration: '10s', target: 0 },
      ],
      gracefulRampDown: '0s',
    },
  },
};

export default function () {
  http.get('https://test.k6.io/contacts.php');
  // Injecting sleep
  // Sleep time is 500ms. Total iteration time is sleep + time to finish request.
  sleep(0.5);
}

注意

如果将 gracefulRampDown 设置为 0 秒,在减少阶段,某些迭代可能会被中断。

观察

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

Ramping VUs

根据我们的测试场景输入和结果

  • 配置定义了 2 个阶段,总测试持续时间为 30 秒;
  • 阶段 1 在 20 秒内将 VU 从 startVUs 的 0 线性增加到目标 10;
  • 在阶段 1 结束时有 10 个 VU,然后阶段 2 在 10 秒内将 VU 线性减少到目标 0;
  • default 函数的每次迭代预计约为 515ms,即约 ~2 次/秒;
  • 随着 VU 数量的变化,迭代率直接相关;每个增加的 VU 会使速率增加约 2 次/秒,而每个减少的 VU 会使速率减少约 2 次/秒;
  • 该示例在整个测试过程中执行了约 300 次迭代。

获取阶段索引

要获取当前运行阶段的索引,请使用 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');
  }
}

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