Gatling脚本技术咨询:每10分钟10k RPS负载持续2小时
实现每10分钟10k RPS周期性负载的Gatling方案
这个场景完全可以实现,你的现有脚本问题出在没有控制请求速率、循环次数错误以及负载阶段划分不清晰,下面是具体的问题分析和解决办法:
现有脚本的问题
- 循环次数错误:2小时每10分钟一个周期,总共是12次循环(120分钟/10分钟),不是20次
- 缺少RPS控制逻辑:Gatling不会自动达到指定RPS,必须通过
throttle或用户注入策略来控制请求速率 - 负载结构缺失:没有区分“高负载运行阶段”和“间隔阶段”,单纯的repeat无法实现周期性脉冲负载
- maxDuration用法错误:该方法是限制单个用户的最大运行时长,不是整个测试的总时长
解决办法与代码示例
下面是精准实现需求的Gatling脚本,核心思路是用循环控制每个周期的负载运行与间隔,结合throttle强制锁定10k RPS:
import io.gatling.core.Predef._ import io.gatling.http.Predef._ import scala.concurrent.duration._ class PeriodicHighLoadTest extends Simulation { // 配置HTTP协议 val httpConf = http .baseUrl("http://your-target-api.com") // 替换为你的目标服务地址 .acceptHeader("application/json") // 定义测试场景:从CSV取数据,执行请求 val testScenario = scenario("10k RPS Periodic Load") .feed(csv("load.csv").circular) // 循环读取CSV数据,避免数据耗尽 .exec(http("business-request") .get("/your-endpoint") // 替换为实际接口路径 .queryParam("key", "${csv-field}")) // 使用CSV中的参数(替换为你的列名) // 配置周期参数:可根据需求调整 val cycleDuration = 10.minutes // 每个周期总时长10分钟 val loadRunDuration = 1.minute // 每个周期内10k RPS运行时长(比如1分钟高峰) val intervalDuration = cycleDuration - loadRunDuration // 间隔休息时长 val totalCycles = 12 // 2小时共12个周期 setUp( testScenario.inject( // 先拉起足够支撑10k RPS的用户数:用户数=RPS*平均响应时间(秒) // 示例:假设平均响应时间1秒,需要10k用户,5分钟内逐步拉起 rampUsers(10000) over (5.minutes), // 循环执行周期性负载 repeat(totalCycles) { // 维持10k RPS运行指定时长 constantUsersPerSec(10000) during (loadRunDuration) .andThen( // 间隔休息 nothingFor(intervalDuration) ) } ).throttle( // 强制锁定请求速率:30秒内升到10k RPS,然后维持到负载运行结束 reachRps(10000) in (30.seconds), holdFor(loadRunDuration) ).protocols(httpConf) ).maxDuration(2.hours) // 兜底限制总测试时长不超过2小时 }
关键注意事项
- 用户数估算:用户数=目标RPS × 接口平均响应时间(秒),比如接口响应时间0.5秒,只需要5000用户就能支撑10k RPS,务必根据实际接口性能调整
rampUsers的数值 - 全周期高负载:如果需要每个10分钟周期内全程维持10k RPS,只需把
loadRunDuration设为10.minute,intervalDuration设为0即可 - 性能支撑:10k RPS属于高负载,单台Gatling机器可能无法支撑,建议使用Gatling分布式集群,同时确保目标服务、网络带宽能承受该量级请求
- CSV数据循环:添加
.circular确保CSV数据耗尽后自动循环读取,避免测试中断
内容的提问来源于stack exchange,提问作者Raghunath Rao
相关产品推荐
相关产品推荐

