不理解k6的指标

不理解k6的指标

我已经对我的服务器进行了负载测试k6并且我对所取得的结果存有一些怀疑。

          /\      |‾‾|  /‾‾/  /‾/   
     /\  /  \     |  |_/  /  / /    
    /  \/    \    |      |  /  ‾‾\  
   /          \   |  |‾\  \ | (_) | 
  / __________ \  |__|  \__\ \___/ .io

    init [----------------------------------------------------------] runner
    init [----------------------------------------------------------] options
    init [----------------------------------------------------------] executor
    init [----------------------------------------------------------]   engine
    init [----------------------------------------------------------]   collector
    init [----------------------------------------------------------]   server
  execution: local
     output: -
     script: ./src/benchmark/script.js

    duration: 20s, iterations: -
         vus: 1,   max: 1

    init [----------------------------------------------------------] starting
    ✓ status was 200

    checks.....................: 100.00% ✓ 477 ✗ 0  
    data_received..............: 9.5 GB  477 MB/s
    data_sent..................: 55 kB   2.8 kB/s
    http_req_blocked...........: avg=3.69µs  min=1.88µs  med=2.87µs  max=282.62µs p(90)=4.08µs  p(95)=4.33µs 
    http_req_connecting........: avg=485ns   min=0s      med=0s      max=232.2µs  p(90)=0s      p(95)=0s     
    http_req_duration..........: avg=18.87ms min=18.18ms med=18.86ms max=27.83ms  p(90)=19.35ms p(95)=19.44ms
    http_req_receiving.........: avg=36.37µs min=13.59µs med=23.64µs max=786.38µs p(90)=60.69µs p(95)=80.54µs
    http_req_sending...........: avg=39.7µs  min=13.82µs med=20.18µs max=3.16ms   p(90)=34.81µs p(95)=35.58µs
    http_req_tls_handshaking...: avg=0s      min=0s      med=0s      max=0s       p(90)=0s      p(95)=0s     
    http_req_waiting...........: avg=18.8ms  min=18.15ms med=18.82ms max=27.77ms  p(90)=19.26ms p(95)=19.31ms
    http_reqs..................: 478     23.899925/s
    iteration_duration.........: avg=41.83ms min=40.07ms med=41.51ms max=112.2ms  p(90)=42.18ms p(95)=42.66ms
    iterations.................: 477     23.849925/s
    vus........................: 1       min=1 max=1
    vus_max....................: 1       min=1 max=1

注意事项:

  • 响应的大小为20MB。
  • 我已经配置了仅 1 个虚拟用户的测试。
  • 客户端(一个 m5.4xlarge EC2 实例)向服务器(另一个 m5.4xlarge EC2 实例)发出这些请求。
  • 两台服务器位于同一可用区域。
  • 我已经 ping 了我的服务器并得到了以下结果:
150 packets transmitted, 150 received, 0% packet loss, time 152557ms
rtt min/avg/max/mdev = 0.162/0.220/0.293/0.031 ms

150 packets transmitted, 150 received, 0% packet loss, time 152569ms
rtt min/avg/max/mdev = 0.164/0.217/0.262/0.028 ms

150 packets transmitted, 150 received, 0% packet loss, time 152574ms
rtt min/avg/max/mdev = 0.162/0.218/0.426/0.037 ms

150 packets transmitted, 150 received, 0% packet loss, time 152567ms
rtt min/avg/max/mdev = 0.173/0.227/0.266/0.028 ms

我感兴趣的指标如下:

  • http_req_receiving........: 平均=36.37µs
  • http_req_sending..........: 平均=39.7µs
  • http_req_waiting...........: 平均=18.8ms
  • http_req_duration..........: 平均=18.87ms
  • 迭代持续时间.........:平均=41.83ms

如果 k6 文档说:

  • http_req_sending:向远程主机发送数据所花费的时间。
  • http_req_receiving:从远程主机接收响应数据所花费的时间。

平均 ping 值为 0.220ms (220µs),http_req_receiving 和 http_req_sending 均低于平均 ping 值。

我遇到的问题是我不知道如何将 ping 与 http_req_receiving 和 http_req_sending 关联起来。

我的想法是 http_req_sending 是请求从 A 点到 B 点所花费的时间,而 http_req_receiving 是请求从 C 点到 D 点所花费的时间。我对吗?

检查下面的图片:https://i.ibb.co/m6JJDK1/Screen-Shot-2019-02-02-at-11-23-00.png

编辑: 我已经用 ... 建议的卷曲进行了测试。以下是一些卷曲的结果:

对于包含 2000 万个字符 (20MB) 的响应:

连接:0.000241 TTFB:0.028431 总时间:0.061042

连接:0.000254 TTFB:0.018196 总时间:0.050792

连接:0.000236 TTFB:0.023359 总时间:0.056002

连接:0.001865 TTFB:0.019826 总时间:0.053621

连接:0.000238 TTFB:0.018920 总时间:0.051638

连接:0.000240 TTFB:0.018243 总时间:0.050905

连接:0.000226 TTFB:0.019197 总时间:0.051828

连接:0.000226 TTFB:0.018293 总时间:0.050941

连接:0.000239 TTFB:0.019187 总时间:0.051830

对于包含 1 个字符(1 个字节)的响应:

连接:0.000241 TTFB:0.000539 总时间:0.000562

连接:0.000238 TTFB:0.000532 总时间:0.000553

连接:0.000237 TTFB:0.000525 总时间:0.000547

连接:0.000257 TTFB:0.000524 总时间:0.000548

连接:0.000231 TTFB:0.000499 总时间:0.000519

连接:0.000238 TTFB:0.000512 总时间:0.000537

连接:0.000232 TTFB:0.000511 总时间:0.000534

答案1

正如前面提到的,k6 提供的指标(主要是)针对 HTTP 协议,因此将其与 ping 关联起来可能有点……棘手:)。

主要ping测量单个数据包从 A 点到 B 点需要多长时间。从 C 到 D 的综合。它不单独测量任何一条路径。这就是通常所说的往返。同样重要的是要注意,ping 不使用 tcp,这在我们拥有多个往返(如 HTTP 请求的情况)时会增加额外的加速/减速。

另一方面,k6 测量的是所有的HTTP 请求(大量的往返)正在发生。特别http_req_sending是测量从 k6 获得与主机的连接到写入请求的整个时间。分别http_req_receiving是从 k6 收到第一个字节到收到响应的最后一个字节的整个时间。它们都没有真正测量往返——在发送的情况下,底层操作系统可能实际上在一段时间内不会发送数据,我们可能会非常快地从操作系统收到整个响应。

对于您的特定数字:http_req_sending看起来还不错 - 它很小,因为它主要是我们向连接写入一些字节,而操作系统表示它将发送数据。有趣的是您的http_req_receiving它也非常小(一致),因为我预计它会花费更长的时间,响应如此大小。要么在 k6 之前的某个地方发生了一些非常繁重的缓冲,要么您使用的是旧版本的 k6(v0.23.1 之前),在使用 HTTP2 时我们遇到了一些错误。或者我们还没有修复这些情况下的所有错误 :(。

您可能需要测试curl一下响应时间有多长

curl -o /dev/null -H 'Cache-Control: no-cache' -s -w "Connect: %{time_connect} TTFB: %{time_starttransfer} Total time: %{time_total} \n"

curl 脚本来自https://gist.github.com/sandeepraju/1f5fbdbdd89551ba7925abe2645f92b5

来源:我是一名 k6 开发人员;)

相关内容