达到更多虚拟用户时 k6 显示的错误

Posted

技术标签:

【中文标题】达到更多虚拟用户时 k6 显示的错误【英文标题】:Errors shown by k6 when reaching a bigger number of virtual users 【发布时间】:2020-04-07 08:59:46 【问题描述】:

我正在评估 k6 以满足我的负载测试需求。我已经设置了一个基本的负载测试,我目前正在尝试解释我得到的错误消息和结果值。也许有人可以帮助我解释我所看到的:

如果我将 VUS 提高到 300 左右,我开始在控制台中看到错误消息,并且出现 500 条错误消息。

这些主要包括:

拨号 tcp XXX:443: i/o 超时 read tcp YYY(local ip):35252->XXX(host ip):443: read: connection reset by peer level=warning msg="请求失败" error="unexpected EOF" 获取https://REQUEST_URL/:超出上下文截止日期"

我的几项检查也有问题:

检查 res.status === 0 和 res.body === null 的错误 检查 res.status === 0 但正文包含正确内容的错误

res.status 怎么可能是 0 但正文仍然包含正确的值?

我怀疑我已达到负载生产机器的连接限制,这就是我收到错误消息的原因。所以我必须建立一个集群或转移到 Cloud runners!?

k6 生成的统计数据显示很长的http_req_blocked 值,我将其解释为等待获取连接端口的时间。这似乎表明我的测试运行机器的连接池已达到极限。

http_req_blocked...........: avg=5.66s    min=0s    med=3.26s    max=59.38s p(90)=13.12s   p(95)=20.31s 
http_req_connecting........: avg=1.85s    min=0s    med=280.16ms max=24.27s p(90)=4.2s     p(95)=9.24s  
http_req_duration..........: avg=2.05s    min=0s    med=496.24ms max=1m0s   p(90)=4.7s     p(95)=8.39s  
http_req_receiving.........: avg=600.94ms min=0s    med=82.89µs  max=58.8s  p(90)=436.95ms p(95)=2.67s  
http_req_sending...........: avg=1.42ms   min=0s    med=35.8µs   max=11.76s p(90)=56.22µs  p(95)=62.45µs
http_req_tls_handshaking...: avg=3.85s    min=0s    med=1.78s    max=58.49s p(90)=8.93s    p(95)=15.81s 
http_req_waiting...........: avg=1.45s    min=0s    med=399.43ms max=1m0s   p(90)=3.23s    p(95)=5.87s 

谁能帮我解释一下我看到的结果?

【问题讨论】:

res.status === 0 和正确的正文似乎是一个错误,请您报告它,可能还有更多信息。例如,在这种情况下您是否设置了error 【参考方案1】:

您可能会用完运行器上的 CPU。 正如http specific metrics of the documentation 中所解释的,您对http_req_blocked 的看法是正确的,它(大部分)是从我们说我们想要制作一个 请求何时我们得到一个套接字来执行它。这很可能是因为:

    测试运行程序的 CPU 不足,无法同时处理发出所有其他请求和启动新的请求 被测系统的 CPU 耗尽,并且存在...同样的问题

您将需要监视它们(无论如何都强烈建议您这样做),因为在 100% 运行器 CPU 上的测试可能不太具有代表性 :) 并且您可能不希望您正在测试的系统达到 100%也是。

状态码 === 0 表示我们无法发出请求/读取响应...由于某种原因,通常由 errorerror_code 解释。

正如我所评论的,如果您有状态码 0 和主体,这很可能是一个错误......至少我不记得有一种情况是这样的。

您列出的错误意味着(很可能):

dial tcp XXX:443: i/o timeout

这实际上是我们试图建立一个 tcp 连接并且花费了太长时间(可能是大 http_req_blocking 的原因)

read tcp YYY(local ip):35252->XXX(host ip):443: read: connection reset by peer

另一端关闭了连接..可能是因为达到了一些超时时间 - 例如,如果我们没有超过 30 秒读取,服务器决定我们不再读取并关闭它......在这种情况下在 CPU 为 100% 的情况下,某些连接很可能没有时间读取。

level=warning msg="Request Failed" error="unexpected EOF"

从字面上看,它所说的......当我们完全没想到时,连接关闭了,或者更准确地说,golang net/http stdlib 没想到。很可能只是在请求生命周期中没有返回其他错误的时间点再次超时。

Get https://REQUEST_URL/: context deadline exceeded"

这是因为请求比超时时间(默认为 60 秒)和will at some point be changed to a better error message 花费的时间更长。

【讨论】:

感谢您的出色回答!我检查了日志,在 statusCode===0 和正确的正文之前得到了 'level=warning msg="Request Failed" error="unexpected EOF"'。确实身体不完整,所以这很可能是超时。我的测试运行器的 CPU 甚至没有超过 10%,所以它必须是被测试的机器。我会为它设置 CPU 监控。 同时检查您的网络连接。如果您的机器之间的带宽不足,或者其他任何东西 - 路由器、防火墙和 API 网关可能会增加限制,或者只是没有带宽进行测试 我在同一条船上,正在读取 tcp XXX -> YY:使用封闭的网络连接。你有解决这个问题的方法吗? 不,我没有继续使用 k6。

以上是关于达到更多虚拟用户时 k6 显示的错误的主要内容,如果未能解决你的问题,请参考以下文章

k6 中的 sleep 功能是暂停所有虚拟用户的执行,还是一次只暂停一个用户的执行?

linux虚拟机移动后密码错误

桌面云组件中哪个是提供登录虚拟桌面

为啥开启虚拟机显示内部错误

linux虚拟机开启的时候,显示内部错误,怎么解决?

华为交换机S5700 vty 0 4