在使用 K6 时测量 x 个请求的持续时间
Posted
技术标签:
【中文标题】在使用 K6 时测量 x 个请求的持续时间【英文标题】:Measure the duration of x amount of requests while using K6 【发布时间】:2021-04-03 18:50:33 【问题描述】:我想使用 K6 来衡量 API 处理 1.000.000 个请求(总共)所花费的时间。
场景
执行 1.000.000(总共 100 万)获取 50 个并发用户/线程的请求,因此每个用户/线程执行 20.000 个请求。
我已经设法使用 Artillery.io 创建了这样一个场景,但我不确定如何在使用 K6 时创建相同的场景。你能指出我正确的方向以创建场景吗? (大多数示例都使用预定义的持续时间,但在这种情况下,我不知道持续时间 -> 这正是我想要测量的)。
炮兵yml
config:
target: 'https://localhost:44000'
phases:
- duration: 1
arrivalRate: 50
scenarios:
- flow:
- loop:
- get:
url: "/api/Test"
count: 20000
K6 js
import http from 'k6/http';
import check, sleep from 'k6';
export let options =
iterations: 1000000,
vus: 50
;
export default function()
let res = http.get('https://localhost:44000/api/Test');
check(res, 'success': (r) => r.status === 200 );
【问题讨论】:
【参考方案1】:您在 k6 脚本 options
中指定的 iterations
+ vus
将导致 shared-iterations
executor,其中 VU 将从常见的 1m 迭代堆中“窃取”迭代。因此,较快的 VU 将完成略多于 20k 的请求,而较慢的 VU 将完成略少的请求,但总体而言您仍会收到 100 万个请求。如果你想看看你能多快完成 100 万个请求,那可以说是更好的方法......
但是,如果每个 VU 恰好 20k 个请求是一项严格要求,您可以使用恰当命名的per-vu-iterations
executor 轻松做到这一点:
export let options =
discardResponseBodies: true,
scenarios:
'million_hits':
executor: 'per-vu-iterations',
vus: 50,
iterations: 20000,
maxDuration: '2h',
,
,
;
无论如何,我强烈建议将maxDuration
设置为较高的值,因为任一执行器的默认值都只有10 分钟。如果您不关心响应正文内容,discardResponseBodies
可能会对性能有所帮助。
顺便说一句,您也可以在 k6 中执行您在 Artillery 中所做的事情,让 50 个 VU 每个开始一次迭代,然后在该一次迭代中循环 http.get()
调用 20000 次......你不会通过这种方式获得非常好的用户体验,k6 进度条将一直冻结到最后,因为 k6 不会知道您在每次迭代中的实际进度,但它也可以工作。
【讨论】:
以上是关于在使用 K6 时测量 x 个请求的持续时间的主要内容,如果未能解决你的问题,请参考以下文章
使用 K6 - 3000 VU 轰炸 AWS EC2。连接开始超时,现在我无法通过 SSL 或 HTTP 请求连接到实例。这是啥?