【问题标题】:Measure the duration of x amount of requests while using K6在使用 K6 时测量 x 个请求的持续时间
【发布时间】: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 });
}

【问题讨论】:

    标签: load-testing k6


    【解决方案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 不会知道您在每次迭代中的实际进度,但它也可以工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-24
      • 1970-01-01
      • 2020-09-20
      • 1970-01-01
      • 2021-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多