高负载下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) }
测试输出结果
高负载场景
- http_req_duration{url_0:https://url1} = p(90) 2434ms
- 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
相关产品推荐
相关产品推荐

