达到更多虚拟用户时 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 表示我们无法发出请求/读取响应...由于某种原因,通常由 error
和 error_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 显示的错误的主要内容,如果未能解决你的问题,请参考以下文章