K6固定100 VU场景配置疑问:为何无法达到目标RPS?
我在性能测试中使用K6 scenarios编写了如下配置,期望在保持100个虚拟用户(VU)不变的前提下,生成不同每秒请求数(RPS)的流量。
配置代码:
export let options = { scenarios: { foo: { executor: 'ramping-arrival-rate', preAllocatedVUs: 100, //start & end at 100 VUs startRate: baseRPS, timeUnit: '1s', stages: [ { target: baseRPS * 10, duration: '0s' }, // jump to 10 iterations/s immediately { target: baseRPS * 10, duration: '30s' }, // stay at 10 iterations/s for the next 30 seconds { target: baseRPS * 20, duration: '0s' }, // jump to 20 iterations/s immediately { target: baseRPS * 20, duration: '30s' }, // stay at 20 iterations/s for the next 30 seconds { target: baseRPS * 30, duration: '0s' }, // jump to 30 iterations/s immediately { target: baseRPS * 30, duration: '30s' }, // stay at 30 iterations/s for the next 30 seconds ], }, }, insecureSkipTLSVerify: true, };
执行时K6虽按阶段运行,但结果显示平均仅生成约7 RPS,远低于目标值;同时,接收K6测试结果的Grafana面板显示RPS全程无明显大幅变化。请问是配置存在错误,还是100个VU不足以支撑目标RPS?
问题分析与解决建议
核心原因判断
当前RPS上不去,大概率是单个迭代的执行时间过长,导致100个VU的处理能力跟不上目标RPS的需求,而非单纯的配置语法错误。
比如假设每个迭代(包含请求、响应处理等逻辑)平均耗时14秒,那么100个VU最多能支撑的RPS是 100 / 14 ≈7,刚好和你观测到的结果匹配。
配置中的潜在问题
ramping-arrival-rate的VU逻辑误解:
你设置了preAllocatedVUs:100,但这个参数只是预初始化100个VU,ramping-arrival-rateexecutor默认会根据迭代需求动态调整VU数量(上限是maxVUs,你没设置的话默认等于preAllocatedVUs)。但如果迭代耗时太长,就算有100个VU,也无法完成目标速率的迭代。瞬间跳变的阶段配置:
用duration: '0s'瞬间切换目标RPS,会导致K6在极短时间内分配所有VU去处理迭代,后续更高RPS阶段没有多余VU可用,反而无法达到目标速率。
解决步骤
排查迭代耗时:
查看K6输出的iteration_duration指标,确认单个迭代的平均执行时长。如果耗时过长,先优化测试脚本(比如移除不必要的逻辑)或被测系统的响应速度。计算所需VU数量:
理论所需VU数量公式:目标RPS × 平均迭代时长(秒)。比如目标30 RPS,每个迭代耗时1秒,需要30个VU;如果每个迭代耗时5秒,则需要150个VU。据此判断100个VU是否足够。调整配置参数:
- 添加
maxVUs:如果机器性能允许,设置一个比preAllocatedVUs更高的值(比如200),让K6可以根据需求扩容VU。 - 修改阶段过渡时长:把
duration: '0s'改成duration: '1s',给K6留足时间调整VU分配,避免瞬间压满资源。 - 确认
baseRPS变量值:检查该变量是否正确定义,比如如果baseRPS=1,目标RPS是10/20/30;如果baseRPS值过小,目标RPS自然达不到预期。
- 添加
内容的提问来源于stack exchange,提问作者Fylix

