了解 k6 如何在低级别管理短时间内的大量 API 调用

Understand how k6 manages at low level a large number of API call in a short period of time

我是 k6 的新手,如果我问的问题很幼稚,我很抱歉。我试图了解该工具如何在幕后管理网络调用。是否以他可以的最大速度执行它们?是否根据被测系统的响应时间对它们进行排队?

我需要得到它,因为我 运行 使用 k6 runk6 cloud 进行了大量测试,但我每秒不能发出超过 ~2000 个请求(查看 k6 结果)。我想知道是否是 k6 实施了某种背压机制,如果它知道我的系统“慢”,或者是否有其他原因导致我无法克服该限制。

我读到 here 可以每秒发出 300.000 个请求,并且已经为此配置了云环境。我也尝试手动配置我的机器,但没有任何改变。

例如以下测试完全相同,唯一的变化是 VU 的数量。我 运行 所有测试都在 k6 cloud.

共享参数:

60 api calls (I have a single http.batch with 60 api calls)
Iterations: 100
Executor: per-vu-iterations

这里我得到了547reqs/s:

VUs: 10 (60.000 calls with an avg response time of 108ms)

这里我得到了 1.051,67 reqs/s:

VUs: 20 (120.000 calls with an avg response time of 112 ms)

我得到了 1.794,33 reqs/s:

VUs: 40 (240.000 calls with an avg response time of 134 ms)

这里我得到了 2.060,33 reqs/s:

VUs: 80 (480.000 calls with an avg response time of 238 ms)

这里我得到2.223,33 reqs/s:

VUs: 160 (960.000 calls with an avg response time of 479 ms)

这里我得到了2.102,83峰 reqs/s:

VUs: 200 (1.081.380 calls with an avg response time of 637 ms) // I reach the max duration here, that's why he stop

我所期望的是,如果我的系统无法处理如此多的请求,我必须看到很多超时错误,但我没有看到任何超时错误。我看到的是所有 API 调用都已执行且未返回任何错误。谁能帮帮我?

作为 k6 - 或者更具体地说,您的 VU - 同步执行代码,您可以实现的吞吐量完全取决于您与之交互的系统的响应速度.

让我们以这个脚本为例:

import http from 'k6/http';

export default function() {
  http.get("https://httpbin.org/delay/1");
}

这里的端点被特意设计成需要 1 秒响应。导出的默认函数中没有其他代码。因为每个 VU 将在继续通过 http.get 语句之前等待响应(或超时),所以每个 VU 的最大吞吐量将是一个非常可预测的 1 HTTP request/sec.

通常,响应时间(and/or 错误,如超时)会随着 VU 数量的增加而增加。您最终会达到添加 VU 不会导致更高吞吐量的地步。在这种情况下,您基本上已经确定了被测系统可以处理的最大吞吐量。根本跟不上。

唯一可能不会的情况是当系统运行 k6 用完硬件资源时(通常 CPU 次)。这是你必须时刻注意的事情。

如果您使用的是 k6 OSS,您可以扩展到系统可以处理的尽可能多的 VU(并发线程)。您还可以使用 http.batch 在每个 VU 内同时触发多个请求 (该语句仍将阻塞,直到收到所有响应)。这可能比启动额外的 VU 稍微少一些开销。