4

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

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

这些主要包括:

  • dial tcp XXX:443: i/o timeout
  • 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 

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

4

1 回答 1

7

您可能在运行器上用完了 CPU。正如文档的 http 特定指标中所解释的那样,您是对http_req_blocked的(大多数情况下)是从我们说我们要发出请求到我们得到一个套接字来执行它的时间。这很可能是因为:

  1. 测试运行程序的 CPU 用完了,无法处理所有其他请求和开始新的请求
  2. 被测系统正在耗尽 CPU 并且有......同样的问题

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

状态码 === 0 意味着我们无法发出请求/读取响应......由于某种原因,通常由errorand解释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 秒),并且会在某个时候更改为更好的错误消息

于 2020-04-07T10:34:11.587 回答