k6 https://k6.io/ 工具报告负 http_req_duration 时间

问题描述

我正在尝试使用 k6 工具运行非常简单的场景。 有时它会报告 http_req_duration 时间的负数,这让我很困惑。

问题:这怎么可能,或者如何在这种情况下解释负数?

official doc 中 http_req_duration 指标的描述说

http_req_duration - Total time for the request. It's equal to http_req_sending + http_req_waiting + http_req_receiving (i.e. how long did the Remote Server take to process the request and respond,without the initial DNS lookup/connection times). float

我的测试脚本如下所示:

script.js

import { check } from 'k6';

export let options = {
  thresholds: {
    http_req_duration: ['avg < 200','p(99)<1000','p(99.999)<1000'],},};

export default function () {
  var res = http.get('http://pong/ping/k6');
  check(res,{
    'is status 200': (r) => r.status === 200,'is duration <= 1000ms': (r) => r.http_req_duration < 1000
  });
}

docker-compose.yaml

---
version: "3"
services:
  pong:
    image: "ludenus/pong:0.0.1"
    ports:
    - "8100:80"
    environment:
      PONG_LISTENING_ADDRESS: ":80"
  
  k6:
    image: "loadimpact/k6:0.30.0"
    volumes: 
      - ./script.js:/script.js
    command: run /script.js --vus 2000 --duration 10s
    depends_on: 
      - pong
k6_1    |      checks.....................: 0.00%  ✓ 0     ✗ 133631
k6_1    |      data_received..............: 18 MB  1.8 MB/s
k6_1    |      data_sent..................: 10 MB  1.0 MB/s
k6_1    |      http_req_blocked...........: avg=47.03µs  min=13.6µs     med=20.8µs  max=46.11ms  p(90)=27.1µs  p(95)=33.5µs 
k6_1    |      http_req_connecting........: avg=3.96µs   min=0s         med=0s      max=34.35ms  p(90)=0s      p(95)=0s     
k6_1    |    ✓ http_req_duration..........: avg=14.05ms  min=-15.7758ms med=11.71ms max=163.09ms p(90)=27.25ms p(95)=33.93ms
k6_1    |      http_req_receiving.........: avg=108.11µs min=-34.2818ms med=48.4µs  max=87.86ms  p(90)=83.3µs  p(95)=112.6µs
k6_1    |      http_req_sending...........: avg=47.79µs  min=11.6µs     med=20.5µs  max=56.39ms  p(90)=32.8µs  p(95)=45.6µs 
k6_1    |      http_req_tls_handshaking...: avg=0s       min=0s         med=0s      max=0s       p(90)=0s      p(95)=0s     
k6_1    |      http_req_waiting...........: avg=13.89ms  min=0s         med=11.56ms max=163.01ms p(90)=27.02ms p(95)=33.66ms
k6_1    |      http_reqs..................: 133631 13350.537278/s
k6_1    |      iteration_duration.........: avg=14.9ms   min=287.4µs    med=12.32ms max=227.44ms p(90)=28.72ms p(95)=35.79ms
k6_1    |      iterations.................: 133631 13350.537278/s
k6_1    |      vus........................: 200    min=200 max=200 
k6_1    |      vus_max....................: 200    min=200 max=200 

解决方法

这似乎是 k6 中的一个小错误。我创建了一个关于它的问题:https://github.com/loadimpact/k6/issues/1872

正如我在问题中提到的,这很可能是服务器在我们将整个请求完全发送之前就开始响应的情况。您能否分享任何有助于我们在 GitHub 问题中重现问题的相关细节,例如您要测试的服务器和应用程序、操作系统和网络详细信息等。