在使用 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 postman - 请求标签未添加到邮递员测试

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

使用 k6 下载整个网站

Laravel Session Flash 持续存在 2 个请求

Prometheus Metric Type详解

Jmeter测量JDBC响应时间包括哪些步骤