平滑停止
gracefulStop
是测试结束时的一段时期,在此期间 k6 会让正在进行的迭代完成。
如果测试设置了持续时间或递减阶段,k6 可能会中断正在进行的迭代。这些中断可能导致指标偏差和意外的测试结果。为了解决这个问题,k6 场景有一个 gracefulStop
选项。对于 ramping-vus
执行器,存在一个相关的选项 gracefulRampDown
,允许 VUs 在数量减少时完成迭代。
平滑停止
gracefulStop
选项适用于除 externally-controlled
之外的所有执行器。它指定了 k6 在强制中断迭代之前将等待的时间。默认值是 30s
。
平滑停止示例
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}`);
}
运行此脚本将得到类似如下结果:
running (13.0s), 000/100 VUs, 349 complete and 23 interrupted iterations
contacts ✓ [======================================] 100 VUs 10s
请注意,尽管测试总持续时间为 10 秒,但实际执行时间为 13 秒,这是因为 gracefulStop
允许 VUs 有额外 3 秒的时间来完成正在进行的迭代。当前正在进行的迭代中有 23 个在此时间内未完成,因此被中断。
gracefulRampDown 选项
除了 gracefulStop
,ramping-vus 执行器还有一个 gracefulRampDown
。
当某个阶段的目标值低于前一个阶段的目标值时,k6 可能需要停止在前一个阶段期间启动的一些 VUs。gracefulRampDown
选项控制这些 VUs 在 k6 中断它们之前有多少时间来完成当前任务。
为了了解 gracefulRampDown
的工作原理,您可以使用 k6 run --verbose
运行以下脚本。在此脚本中,迭代的 sleep
时间超过了 gracefulRampdown
时间。因此,当 k6 递减到达到第二阶段的目标时,它必须强制中断 VUs。--verbose
标志会在 VUs 启动、进入宽限期以及被强制中断时记录到您的控制台。
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);
}