如何在Gatling中实现无用户到达峰值的平稳并发用户数下调
你当前拼接多个独立constantConcurrentUsers段的写法,阶段切换时Gatling会直接调整并发数,没有过渡过程,因此会出现用户量陡变的峰值,以下是两种可实现平稳无峰值调整的方案:
方案1:带恒定阶段的平滑阶梯下调
适合需要每个并发档位维持固定时长的场景,在档位切换时加入短过渡段实现平滑调整,代码示例如下:
// 固定写法,适用于固定阶梯档位 setUp( Test.inject( // 初始平稳拉起15并发 rampConcurrentUsers(0) to 15 during 10, // 15并发维持1分钟 constantConcurrentUsers(15) during 60, // 10秒平滑降到10并发 rampConcurrentUsers(15) to 10 during 10, // 10并发维持1分钟 constantConcurrentUsers(10) during 60, // 10秒平滑降到5并发 rampConcurrentUsers(10) to 5 during 10, // 5并发维持1分钟 constantConcurrentUsers(5) during 60 ) )
如果需要动态生成阶梯,避免重复编码,可以用如下写法:
import io.gatling.core.Predef._ import scala.concurrent.duration._ val startConcurrency = 15 val endConcurrency = 5 val step = -5 val holdDuration = 60.seconds val rampDuration = 10.seconds val injectSteps = (startConcurrency to endConcurrency by step).sliding(2).flatMap { case Seq(current, next) => Seq( constantConcurrentUsers(current) during holdDuration, rampConcurrentUsers(current) to next during rampDuration ) }.toSeq :+ constantConcurrentUsers(endConcurrency) during holdDuration // 加上初始拉起逻辑可选 val fullInjectSteps = rampConcurrentUsers(0) to startConcurrency during rampDuration +: injectSteps setUp(Test.inject(fullInjectSteps))
方案2:全程匀速平滑下调
如果不需要在每个并发档位停留,只需要实现每分钟降5个并发的整体速率,直接使用单段rampConcurrentUsers即可,完全无峰值:
setUp( Test.inject( // 2分钟从15平稳降到5,速率刚好是每分钟降5个 rampConcurrentUsers(15) to 5 during 120.seconds ) )
补充说明
constantConcurrentUsers、rampConcurrentUsers都属于闭负载模型,核心是控制同时在线的并发用户数,和atOnceUsers所属的开负载模型逻辑不同:开负载模型控制的是用户的新增速率,不受业务响应耗时影响。如果你的场景需要和atOnceUsers逻辑完全一致,可以切换到开负载模型的rampUsersPerSec方法调整注入速率。- 过渡段的时长可以根据你的压测需求调整,设置的越长,并发数调整越平缓。
内容的提问来源于stack exchange,提问作者Iryna
相关产品推荐
相关产品推荐

