在上一篇实战讲解了Gatling的用例,不过还没涉及到性能方面的内容,其实用例中的最后一句就和性能有关了
setUp(scn.inject(atOnceUsers(1)).protocols(httpConf))
这样写更好理解一些
setUp(————表示本用例的压力设置 scn.inject(————表示对用例中哪个场景进行压力设置,如果你定义了两个场景,例如官网例子的val users = scenario("Users")和val admins = scenario("Admins"),那么你需要分别对两个场景的压力进行设置 atOnceUsers(1)————核心,具体的压力设置,下面有各种设置的使用说明 ).protocols(httpConf)————表示要测试的数据定义,就是你在用例开始时定义var httpConf )
Gatling提供了多种压力设置的方法,如下所示
setUp( scn.inject( nothingFor(4 seconds), // 1 atOnceUsers(10), // 2 rampUsers(10) over(5 seconds), // 3 constantUsersPerSec(20) during(15 seconds), // 4 constantUsersPerSec(20) during(15 seconds) randomized, // 5 rampUsersPerSec(10) to(20) during(10 minutes), // 6 rampUsersPerSec(10) to(20) during(10 minutes) randomized, // 7 splitUsers(1000) into(rampUsers(10) over(10 seconds)) separatedBy(10 seconds), // 8 splitUsers(1000) into(rampUsers(10) over(10 seconds)) separatedBy(atOnceUsers(30)), // 9 heavisideUsers(1000) over(20 seconds) // 10 ).protocols(httpConf) )
下面具体说说每种压力设置后的实际效果
1、nothingFor(duration): 在指定的时间段(duration)内什么都不干
实例:nothingFor(4 seconds)或者nothingFor(1 minutes),(注,下方每种可以设置时间的地方都可以根据实际需要用seconds或者minutes来限制)
实际效果:真的是什么都不干。。。设置之后一直循环sleep,不知道有啥用,估计用于下方的组合压力设置的吧
2、atOnceUsers(nbUsers): 一次模拟的用户数量(nbUsers)。
实例:atOnceUsers(10)
实际效果:运行后即时同时10个数据包,如图
3、rampUsers(nbUsers) over(duration): 在指定的时间段(duration)内逐渐增加用户数到指定的数量(nbUsers)。
实例:rampUsers(10) over(5 seconds)
实际效果:运行后从1开始逐渐增加每秒并发,直到发了10个包,如图,注意图中时间
4、constantUsersPerSec(rate) during(duration): 以固定的速度模拟用户,指定每秒模拟的用户数(rate),指定模拟测试时间长度(duration)。
实例:constantUsersPerSec(10) during(10 seconds)
实际效果:运行后每秒并发为10,直到运行了10秒钟,如图,这个用来做稳定性测试不错
5、constantUsersPerSec(rate) during(duration) randomized: 以固定的速度模拟用户,指定每秒模拟的用户数(rate),指定模拟时间段(duration)。用户数将在随机被随机模拟(毫秒级别)。数量太少时和上面的效果差不多
实例:constantUsersPerSec(10) during(10 seconds) randomized
实际效果:运行后每秒并发为10左右,直到运行了10秒钟
6、rampUsersPerSec(rate1) to (rate2) during(duration): 在指定的时间(duration)内,使每秒模拟的用户从数量1(rate1)逐渐增加到数量2(rate2),速度匀速。
实例:rampUsersPerSec(10) to(20) during(10 minutes)
实际效果:运行后每秒并发为10,然后匀速增加每秒并发,10分钟后,并发变为20,然后结束
7、rampUsersPerSec(rate1) to (rate2) during(duration) randomized: 在指定的时间(duration)内,使每秒模拟的用户从数量1(rate1)增加到数量2(rate2),速度随机。
实例:rampUsersPerSec(10) to(20) during(10 minutes) randomized
实际效果:运行后每秒并发为10,然后随机增加并发,10分钟后,并发变为20,然后测试结束
8、splitUsers(nbUsers) into(injectionStep) separatedBy(duration): 反复执行所定义的模拟步骤(injectionStep),每次暂停指定的时间(duration),直到总数达到指定的数量(nbUsers)
实例:splitUsers(1000) into(rampUsers(10) over(10 seconds)) separatedBy(10 seconds)
实际效果:反复执行rampUsers(10) over(10 seconds),每次执行间隔10秒,发了1000个包后,测试结束
9、splitUsers(nbUsers) into(injectionStep1) separatedBy(injectionStep2):反复依次执行所定义的模拟步骤1(injectionStep1)和模拟步骤2(injectionStep2),直到总数达到指定的数量(nbUsers)左右,因为如果设置不好不一定能到达总数,见下方说明。
实例:splitUsers(100) into(rampUsers(10) over(10 seconds)) separatedBy(atOnceUsers(30))
实际效果:先执行rampUsers(10) over(10 seconds),再执行atOnceUsers(30),反复如此,理论上直到发了100个包后,测试结束,这个例子不行,因为10-30-10-30-10这样循环后就已经90个包了,如果再执行下一个atOnceUsers(30)就超出了,所以发到90的时候测试结束
10、heavisideUsers(nbUsers) over(duration): 在指定的时间(duration)内使用类似单位阶跃函数的方法逐渐增加模拟并发的用户,直到总数达到指定的数量(nbUsers).简单说就是每秒并发用户数递增。
实例:heavisideUsers(1000) over(20 seconds)
实际效果:在20秒内增加并发数,直到发了1000个包左右,测试结束,至于是不是用了单位阶跃函数我就没有细究了,部分抓包结果如图