我正在尝试在 K6 中使用分阶段设置和概要设置运行。我正在尝试找出如何设置 K6,以便在阶段完成后开始新的运行迭代。我只是在阶段块中包含迭代,还是我需要做其他事情?
1 回答
您基本上想要的是在很长一段时间内重复的一组给定阶段。
有两种解决方案:
只需在 bash/cmd/shell 脚本的循环中运行脚本 - 在运行之间会有一些暂停,因为 k6 需要再次初始化。此外,您将有多个输出,但这可能还不错,见下文
拥有尽可能多的阶段。您可以手动完成,也可以在测试脚本中编写脚本:
import http from "k6/http";
import { check, sleep } from "k6";
let stages = [// total 30 seconds
// Ramp-up from 1 to 5 VUs in 10s
{ duration: "10s", target: 5 },
// Stay at rest on 5 VUs for 5s
{ duration: "5s" },
// Ramp-down from 5 to 0 in 15s
{ duration: "15s", target: 0}
];
let final_stages = [];
// 30 seconds by 120 seconds is 3600 seconds or 1 hour
for (let i =0 ;i < 120; i++) {
final_stages = final_stages.concat(stages)
}
export let options = {
stages: final_stages,
discardResponseBodies: true
};
export function setup() {
console.log(JSON.stringify(options.stages));
}
export default function(testStart) {
// normal execution
let res = http.get("http://httpbin.org/");
check(res, { "status is 200": (r) => r.status === 200 });
}
我强烈建议使用阈值运行 k6,--no-summary
甚至可能--no-thresholds
不使用阈值,如果它运行的时间会很好,因为你可能会用完内存,只是在 k6 内收集数据。这意味着您可能应该为influxdb 甚至 Load Impact 的 Insights 等指标使用一些存储空间。在您的情况下,这当然可能不是真的 - 您必须检查:)。
按照我之前理解的问题回答:“我想要有阶段,然后我想要对脚本进行一些具体数量的迭代,而不是像另一个阶段那样在给定的持续时间内进行”
简单回答是不。
如果您有阶段,测试的迭代和持续时间是相互排斥的 - 只有其中一个会被考虑在内。看看最后可能的解决方法。
长答案:
如果我理解正确,您想要的是拥有一堆阶段,然后在所有阶段都运行之后,有一些 VUS 会执行给定数量的迭代。目前不支持此功能,我们(k6 团队)对此很感兴趣,为什么您需要它。
解决方法:目前我可以想到两种解决方法 - 都是hacky:
- 如果您在以后的迭代中不需要测试中的任何内容,请进行两个测试并制作一个 bash/shell/cmd 脚本来一个接一个地运行它们。这将在测试运行之间暂停,您将有两个输出,但肯定会更容易。
- 在所有阶段都以足够长的持续时间完成以运行所有迭代后,再创建一个阶段。有一个变量记录整个测试的开始 - 最好在设置中,然后在到达最后阶段时计算。运行尽可能多的迭代,然后在剩余的测试中休眠。
重要的是要注意,此时 VU 之间无法进行通信,因此您必须决定,当您有 10 个 VU 时,每个 VU 将执行 5 次以获得 50 次迭代,也许一个 VU 将完成得更快或更晚或类似那。
这显然需要根据您的情况量身定制,并且不准确,但是再次有趣的是,您想用它做什么以及为什么。import http from "k6/http"; import { check, sleep } from "k6"; export let options = { stages: [ // Ramp-up from 1 to 5 VUs in 10s { duration: "10s", target: 5 }, // Stay at rest on 5 VUs for 5s { duration: "5s" }, // run for some amount of time after that { duration: "15s"} ], discardResponseBodies: true }; export function setup() { return Date.now(); } let iter = 5; // how many iteration per VU should be done in the iterations part export default function(testStart) { // 15ms is the amount of time for the pre iterations phase if (Date.now() - testStart > 15 * 1000) { // "iterations part" if (iter == 0) { // we have ran out of iterations to do sleep(15000) // sleep for the duration of the phase } iter = iter - 1; // debug log console.log(__VU, __ITER, iter); // the actual part you want to do let res = http.get("http://httpbin.org/"); check(res, { "status is 200": (r) => r.status === 200 }); } else { // normal execution let res = http.get("http://httpbin.org/"); check(res, { "status is 200": (r) => r.status === 200 }); } }
边注:
在讨论基于到达率的执行过程中,已经讨论了这一点,目前的计划是要支持的,但这项工作可能至少需要一个月的时间才能实现 alpha/beta 功能,因为支持一切都需要大量内部重构我们想和它一起添加。您可能应该为您的用例编写一个问题,以供将来考虑。