使用 K6 测量 x 请求的持续时间

问题描述

我想使用 K6 来测量 API 处理 1.000.000 个请求(总共)所需的时间。

场景

以 50 个并发用户/theads 执行 1.000.000(总共 100 万个)get 请求,因此每个用户/线程执行 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 });
}

解决方法

您在 k6 脚本中指定的 iterations + vus options 将导致 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 不知道您在每次迭代中的实际进度,但它也可以工作。