k6:增加VU数量的每个阶段如何管理rps-limit

Posted

技术标签:

【中文标题】k6:增加VU数量的每个阶段如何管理rps-limit【英文标题】:k6: how to manage rps-limit on each stage of increase the number of VUs 【发布时间】:2019-11-10 10:41:40 【问题描述】:

我有一个关于基本术语的问题,但没有找到详细的解释。输入数据:framework k6 v0.25.1,http-requests。

问题一:从什么角度看VU(虚拟用户)的实现:

1) 客户端;

2) 服务器端;

3) 客户端-服务器的交互?

关于 VU 精髓的精妙之处,您应该阅读哪些内容,尤其是在 k6 中? 现在我发现每个 VU 在客户端和服务器端占用一个网络端口。

加载配置文件:

1) rps:1; vus:1; N 分钟的持续时间——我在 Grafana 中看到请求数量的增加非常少:+~1rps。一切都很好;

2) rps:1; vus:1..1000 在 N 分钟内通过 stages 中的选项 target 加速 - 我看到负载在峰值增加了 ~+100rps,尽管根据 k6 documentation 的选项“rps”是“最大每秒发出的请求数,所有 VU 的总请求数”选项,即不是 ~+100rps,我希望看到负载在 ~1rps,与经验 #1 类比 — 即 rps 限制错误的 k6 错误不会在所有 VU 线程中占用 rps 数量,或者每个 VU 存在所需的 VU 的隐藏合法行为。

注意:我在场景开始和结束时设置了一个任意超时以实现负载分布均匀。

问题 #2:增加 vus 时非法超过 rps 限制的 rps 惊人增长的原因是什么?

例子:

import http from "k6/http";

export let options = 
    stages: [
         duration: "1m", target: 1, rps: 1 ,
         duration: "1m", target: 200, rps: 1 ,
         duration: "1m", target: 500, rps: 1 ,
         duration: "1m", target: 1000, rps: 1 ,
         duration: "1m", target: 500, rps: 1 ,
         duration: "1m", target: 200, rps: 1 ,
         duration: "1m", target: 1, rps: 1 ,
    ]
;

export default function() 
  http.get("https://httpbin.test.loadimpact.com/get"); 
  console.log("request made by VU " + __VU); 
;

【问题讨论】:

【参考方案1】:

Virtual UserVUk6的具体定义和实现。 VU 是执行您的脚本,向您的服务器发出一个或多个 HTTP 请求的实体。

如果你正在测试一个网络服务器,你可以认为VU 和真实用户是一样的。

如果您正在测试 API,VU 每秒向服务器发出的请求数 (RPS) 比您真正的 VUs 多。示例您可以定义 5 个 VU,但每个 VU 每秒可以产生 10 个请求。这就是为什么当您的 VU 增加时,您可以很快达到 RPS 限制。

您可以在link 阅读有关 VU 定义的更多详细信息。

【讨论】:

来自 k6 的文档:“选项 rps:每秒发出的最大请求数,所有 VU 的总数”,但实际上 rps 限制被忽略了。我想知道为什么。 @fpsthirty,我尝试重现您的问题,但我不能。您可以添加更多详细信息吗?我尝试了以下简单的脚本,它按预期工作:import http from "k6/http";export let options = vus: 1000, duration: "60s", rps: 1;export default function () http.get("https://httpbin.test.loadimpact.com/get"); console.log("request made by VU " + __VU); @na--,对不起,例子在这里:gist.github.com/fpsthirty/db548692cc2b9832abd78d8f450e4244我使用stages通过选项target平滑增加VU的数量 好吧,那是你的问题 - rpsstages 中使用时没有任何意义,它是一个全局选项,所以它应该在 options 根目录中。 @na--,是的,你是对的。我在路线图 v1.0.0 github.com/loadimpact/k6/issues/550 的类似功能的主题中看到了您的 cmets。根据当前情况,我将解决方案视为带有命令行标志的顺序启动。例如:k6 run --rps 10 --vus 50 filename.js && k6 run --rps 100 --vus 500 filename.js。但也许你有更好的主意?我很高兴听到您的意见作为结束这个话题的新答案

以上是关于k6:增加VU数量的每个阶段如何管理rps-limit的主要内容,如果未能解决你的问题,请参考以下文章

k6 VU(虚拟用户)有多少内存? [关闭]

K6 负载测试 - 如何为整个测试运行创建顺序 ID

K6 用户和批处理概念

使用 K6 - 3000 VU 轰炸 AWS EC2。连接开始超时,现在我无法通过 SSL 或 HTTP 请求连接到实例。这是啥?

如何在 K6 中为函数应用迭代条件

我们如何编写具有动态阶段数的 k6 脚本?