Gatling负载模型通过inject方法定义,rampUsers、constantUsersPerSec和nothingFor是构建这些模型的基础分别代表了线性增长、恒定压力和控制延迟三种基本负载模式。
1. rampUsers
rampUsers用于在指定的时间段内,将总用户数从0线性增加到目标值。每个用户只会在整个测试中被启动一次,执行完其场景后退出。
行为:用户启动速率是恒定的。例如,rampUsers(100) during (50 seconds)意味着平均每0.5秒启动一个用户(100用户 / 50秒),持续50秒。50秒后,所有100个用户都已被启动,之后不再有新的用户加入。
用途:这是最常用的模型之一,用于系统热身或模拟负载平缓上升的阶段,避免在测试开始时对系统产生瞬时冲击。它通常作为多阶段测试的起始阶段。
2. constantUsersPerSec
constantUsersPerSec用于在整个持续时间内,维持一个恒定的每秒用户到达速率。即无论系统响应快慢,都按照固定节奏尝试启动新用户。
行为:该注入器会持续不断地尝试在每一秒内启动指定数量的用户。例如,constantUsersPerSec(20) during (1 minute)会尝试在1分钟内,每秒都启动20个用户。如果单个用户场景的执行时间很长,系统内的活跃用户数(并发数)会持续累积增长。
用途:模拟一个稳定的、持续的用户访问流量,常用于压力测试的“稳定期”,用于评估系统在恒定压力下的性能表现、资源消耗和稳定性。
3. nothingFor
nothingFor是一个控制性指令,用于在注入策略中插入一段绝对的空闲期,在此期间不启动任何新用户。
行为:纯粹地等待。例如,nothingFor(30 seconds)会让Gatling在运行到此时暂停30秒,然后再执行后续的注入步骤。
用途:主要用于分隔不同的负载阶段,或者用于在测试开始后、正式施压前,等待一个特定的外部条件(如等待缓存预热、等待另一系统就绪)。
区别:rampUsers和rampUsersPerSec
一个常见的混淆点在于rampUsers和另一个方法rampUsersPerSec的区别:
rampUsers(totalUsers) during (duration):控制的是总用户数。它关心的是“在给定时间内,总共启动多少个用户”。用户到达速率是计算得出的(总用户数/时间)。
rampUsersPerSec(rate1) to (rate2) during (duration):控制的是用户到达速率的变化。它关心的是“用户到达速率如何从A点变化到B点”。例如,rampUsersPerSec(1) to (10) during (1 minute) 表示在1分钟内,每秒启动的用户数从1个线性增加到10个。
组合应用
在实际的复杂测试中,这三个基础方法几乎总是被组合使用,来模拟真实的用户访问模式。下面是一个模拟“系统上线后用户逐渐涌入、形成稳定访问、最后经历峰值冲击”的示例:
scala
import io.gatling.core.Predef._
import scala.concurrent.duration._
setUp(
myScenario.inject(
// 阶段1:初始延迟,等待监控就绪
nothingFor(5 seconds),
// 阶段2:在2分钟内,逐步增加100个用户(热身期)
rampUsers(100) during (2 minutes),
// 阶段3:保持每秒5个用户的稳定到达率,持续5分钟(稳定期)
constantUsersPerSec(5) during (5 minutes),
// 阶段4:在30秒内,再快速增加500个用户(峰值冲击)
rampUsers(500) during (30 seconds),
// 阶段5:峰值后,继续保持较高但稳定的压力10秒
constantUsersPerSec(20) during (10 seconds)
)
)
rampUsers控制总量的线性增长,constantUsersPerSec控制恒定的到达流量,而nothingFor控制阶段间的节奏。