菜单
开源 本页内容适用于开源版本。

平滑停止

gracefulStop 是测试结束时的一段时期,在此期间 k6 会让正在进行的迭代完成。

如果测试设置了持续时间或递减阶段,k6 可能会中断正在进行的迭代。这些中断可能导致指标偏差和意外的测试结果。为了解决这个问题,k6 场景有一个 gracefulStop 选项。对于 ramping-vus 执行器,存在一个相关的选项 gracefulRampDown,允许 VUs 在数量减少时完成迭代。

平滑停止

gracefulStop 选项适用于除 externally-controlled 之外的所有执行器。它指定了 k6 在强制中断迭代之前将等待的时间。默认值是 30s

平滑停止示例

JavaScript
import http from 'k6/http';

export const options = {
  discardResponseBodies: true,
  scenarios: {
    contacts: {
      executor: 'constant-vus',
      vus: 100,
      duration: '10s',
      gracefulStop: '3s',
    },
  },
};

export default function () {
  const delay = Math.floor(Math.random() * 5) + 1;
  http.get(`https://quickpizza.grafana.com/api/delay/${delay}`);
}

运行此脚本将得到类似如下结果:

bash
running (13.0s), 000/100 VUs, 349 complete and 23 interrupted iterations
contacts ✓ [======================================] 100 VUs  10s

请注意,尽管测试总持续时间为 10 秒,但实际执行时间为 13 秒,这是因为 gracefulStop 允许 VUs 有额外 3 秒的时间来完成正在进行的迭代。当前正在进行的迭代中有 23 个在此时间内未完成,因此被中断。

gracefulRampDown 选项

除了 gracefulStopramping-vus 执行器还有一个 gracefulRampDown

当某个阶段的目标值低于前一个阶段的目标值时,k6 可能需要停止在前一个阶段期间启动的一些 VUs。gracefulRampDown 选项控制这些 VUs 在 k6 中断它们之前有多少时间来完成当前任务。

为了了解 gracefulRampDown 的工作原理,您可以使用 k6 run --verbose 运行以下脚本。在此脚本中,迭代的 sleep 时间超过了 gracefulRampdown 时间。因此,当 k6 递减到达到第二阶段的目标时,它必须强制中断 VUs。--verbose 标志会在 VUs 启动、进入宽限期以及被强制中断时记录到您的控制台。

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

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

export default function () {
  http.get('https://test.k6.io/contacts.php');
  // adding sleep beyond so that iterations are longer than rampdown
  sleep(5);
}