You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

高负载下K6的http_req_duration指标为0的问题排查求助

负载测试中UPI文件请求http_req_duration为0的排查方向

问题描述

执行服务器负载测试时,发现针对UPI文件的请求http_req_duration指标数值为0,但降低负载(减少测试时长和请求速率)后该指标可正常显示请求时长。查看Nginx日志未发现错误,请求返回状态码均为200和304。

附K6测试脚本

import http from 'k6/http';
const file = JSON.parse(open('./urls.txt'));

const rate_num = 10
const duration_num = '5s'
const preAllocatedVUs_num = 500
const maxVUs_num = 5000

export const options = {
    scenarios: {
        'loadTesting': {
            executor: 'constant-arrival-rate',
            duration: duration_num,
            rate: rate_num,
            preAllocatedVUs: preAllocatedVUs_num,
            maxVUs: maxVUs_num,
            exec: 'oneTest'
        },
        'loadTesting1': {
            executor: 'constant-arrival-rate',
            duration: duration_num,
            rate: rate_num,
            preAllocatedVUs: preAllocatedVUs_num,
            maxVUs: maxVUs_num,
            exec: 'twoTest'
        },
        'loadTesting2': {
            executor: 'constant-arrival-rate',
            duration: duration_num,
            rate: rate_num,
            preAllocatedVUs: preAllocatedVUs_num,
            maxVUs: maxVUs_num,
            exec: 'threeTest'
        },
        'loadTesting3': {
            executor: 'constant-arrival-rate',
            duration: duration_num,
            rate: rate_num,
            preAllocatedVUs: preAllocatedVUs_num,
            maxVUs: maxVUs_num,
            exec: 'fourTest'
        },
        'loadTesting4': {
            executor: 'constant-arrival-rate',
            duration: duration_num,
            rate: rate_num,
            preAllocatedVUs: preAllocatedVUs_num,
            maxVUs: maxVUs_num,
            exec: 'fiveTest'
        },
    },

    thresholds: {}
}

file.forEach((widgets) => {
    widgets.forEach(url => {
        options.thresholds[`http_req_duration{url_${file.indexOf(widgets)}:${url}}`] = ['p(95) < 10000']
    })
})

const one = []
file[0].forEach(widgets => one.push(['GET', widgets, null, {tags: {url_0: widgets}}]))

const two = []
file[1].forEach(widgets => two.push(['GET', widgets, null, {tags: {url_1: widgets}}]))

const three = []
file[2].forEach(widgets => three.push(['GET', widgets, null, {tags: {url_2: widgets}}]))

const four = []
file[3].forEach(widgets => four.push(['GET', widgets, null, {tags: {url_3: widgets}}]))

const five = []
file[4].forEach(widgets => five.push(['GET', widgets, null, {tags: {url_4: widgets}}]))

export function oneTest() {
    http.batch(one)
}

export function twoTest() {
    http.batch(two)
}

export function threeTest() {
    http.batch(three)
}

export function fourTest() {
    http.batch(four)
}

export function fiveTest() {
    http.batch(five)
}

测试输出结果

高负载场景

  1. http_req_duration{url_0:https://url1} = p(90) 2434ms
  2. http_req_duration{url_0:https://url.glb} = p(90) 0ms

低负载场景

{ expected response:true } min=4.39 med=26.53s max=30.98s p(90)=30.09s 
✓ { url_0.lb } min=0 s med=0 s max=0 sp(90)=0 s 
✓ { url_1} min=0 s med=0 s max=0 sp(90)=0 s 
✓ { url_2 } min=4.39 med=4.39 max=4.39 p(90)=4.39s 
✗ {url_3} min=26.53s med=28.76s max=30.98s p(90)=30.54s

data_received.............................................................: 472 MB 12 MB/s
     data_sent.................................................................: 1.1 MB 28 kB/s
     http_req_blocked..........................................................: min=33.98ms med=53.61ms max=67.58ms  p(90)=64.79ms 
     http_req_connecting.......................................................: min=15.81ms med=17.78ms max=24.42ms  p(90)=23.09ms 
     http_req_duration.........................................................: min=4.39s   med=26.53s  max=30.98s   p(90)=30.09s  
       { expected_response:true }..............................................: min=4.39s   med=26.53s  max=30.98s   p(90)=30.09s  
     ✓ { url_0:https://example1/a8f62275.glb }....: min=0s      med=0s      max=0s       p(90)=0s      
     ✓ { url_1:https://example2/53297a9a.glb }....: min=0s      med=0s      max=0s       p(90)=0s      
     ✓ { url_2:https://example3/e8670d23.glb }...: min=4.39s   med=4.39s   max=4.39s    p(90)=4.39s   
     ✗ { url_3:https://example4/df0dac9f.glb }....: min=26.53s  med=28.76s  max=30.98s   p(90)=30.54s  
     ✓ { url_4:https://example5/a97ef0d7.glb }....: min=0s      med=0s      max=0s       p(90)=0s      
     http_req_failed...........................................................: 0.00%  ✓ 0        ✗ 3    
     http_req_receiving........................................................: min=4.36s   med=26.51s  max=30.95s   p(90)=30.06s  
     http_req_sending..........................................................: min=62.12µs med=66.02µs max=159.06µs p(90)=140.45µs
     http_req_tls_handshaking..................................................: min=18.09ms med=19.61ms max=27.8ms   p(90)=26.16ms 
     http_req_waiting..........................................................: min=24.36ms med=34.31ms max=34.33ms  p(90)=34.32ms 
     http_reqs.................................................................: 3      0.074741/s
     iteration_duration........................................................: min=4.45s   med=26.6s   max=31.02s   p(90)=30.13s  
     iterations................................................................: 3      0.074741/s
     vus.......................................................................: 500    min=500    max=500
     vus_max...................................................................: 500    min=500    max=500

可能的原因分析

  • K6批量请求计时逻辑异常:使用http.batch()发起请求时,高负载下部分请求可能因连接复用、本地缓存拦截等原因,未触发完整的请求流程,导致K6未正确统计耗时,直接记录为0。批量请求的计时是从整个批次发起开始计算,若单个请求直接命中缓存或连接池复用,可能被判定为无耗时。
  • 服务器缓存策略极端情况:UPI文件请求返回304(未修改),高负载下服务器可能直接返回缓存标识,跳过完整请求处理流程,导致K6端无法统计到实际耗时。或服务器缓存系统在高负载下直接短路请求处理,响应速度快到K6计时精度无法捕捉。
  • K6 VU资源耗尽与请求丢弃:高负载下配置的preAllocatedVUs: 500和maxVUs:5000若超出系统资源承载能力,部分请求可能被K6内部丢弃,但仍标记为成功响应(200/304),此时计时未被正确记录,显示为0。可对比高/低负载下的http_reqs总数,确认请求量是否符合预期。
  • Nginx连接复用与统计偏差:Nginx在高负载下大量复用连接,缓存命中的304请求处理时间极短,K6计时函数可能因精度问题将其记录为0。可查看Nginx日志中的$request_time变量,确认服务器端实际处理时长是否真的接近0。
  • 脚本标签冲突或统计维度异常:为每个请求添加的url_x标签在高负载下可能导致K6统计模块出现数据覆盖或聚合错误,部分维度的统计值被置为0。可尝试简化标签,或单独测试单个UPI文件请求,验证是否仍出现0值。

内容的提问来源于stack exchange,提问作者koolaa12

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 07:19:56