理发店模型,可以很好的用来理解很多性能测试的概念和理论,以及一些测试中遇到的问题
将抽象的概念具体化,结合实际,通过理发店模型理解系统的性能和并发处理
一、模型假设
在这个理发店中,事先做如下的假设:
- 理发店共有3名理发师
- 每位理发师剪一个头发的时间都是1小时
- 顾客们对于每次光顾理发店时所能容忍的等待时间+剪发时间是3小时,而且等待时间越长,顾客的满意度越低。如果3个小时还不能剪完头发,我们的顾客会立马生气的走人
二、场景构建
2.1 场景1
-
理发店内只有1位顾客 有1名理发师为他提供服务,另外2位等着或打杂帮忙。1小时后,两位顾客剪完头发出门 在这1个小时里,整个理发店只服务了1位顾客,这位顾客花费在这次剪发的时间是1小时
-
理发店内同时有2位顾客 同时有2名理发师在为顾客服务,另外1位等着或打杂帮忙。1小时后,两位顾客剪完头发出门 在这1小时里,整个理发店服务了两位顾客,这两位顾客花费在剪发的时间均为1小时
-
理发店内同时有3位顾客 同时有3名理发师在为顾客服务。1小时后,三位顾客剪完头发出门 在这1小时里,整个理发店服务了三位顾客,这三位顾客花费在剪发的时间均为1小时
场景总结: 在理发店同时服务的顾客数量从1位增加到3位的过程中,随着顾客数量的增多,理发店的整体工作效率在提高,而且每位顾客在理发店内所呆的时间并未延长
当然,可以假设当只有1位顾客和2位顾客时,空闲的理发师可以帮忙打杂,使得其他理发师的工作效率提高,并使每位顾客的剪发时间小于1小时 不过即使根据这个假设,虽然随着顾客数量的增多,每位顾客的服务时间有所延长,但是这个时间始终还被控制在顾客可接受的范围之内,并且顾客是不需要等待的
2.2 场景2
随着理发店的生意越来越好,顾客也越来越多,出现新的场景
假设有一次顾客A、B、C刚进理发店准备剪发,外面一推门又进来了顾客D、E、F 因为A、B、C三位顾客先到,所以D、E、F三位只好坐在长板凳上等着 1小时后,A、B、C三位剪完头发走了,他们每个人这次剪发所花费的时间均为1小时。可是D、E、F三位就没有这么好运,因为他们要先等A、B、C三位剪完才能剪,所以他们每个人这次剪发所花费的时间均为2小时——包括等待1小时和剪发1小时
通过上面这个场景我们可以发现,对于理发店来说,都是每小时服务三位顾客——第1个小时是A、B、C,第二个小时是D、E、F;但是对于顾客D、E、F来说,“响应时间”延长了
2.3 场景3
假设这次理发店里一次来了9位顾客,这9位顾客中有3位的“响应时间”为1小时,有3位的“响应时间”为2小时(等待1小时+剪发1小时),还有3位的“响应时间”为3小时(等待2小时+剪发1小时)——已经到达用户所能忍受的极限。假如在把这个场景中的顾客数量改为10,那么我们已经可以断定,一定会有1位顾客因为“响应时间”过长而无法忍受,最终离开理发店走了
三、性能模型
上面的场景如何与性能测试挂钩呢?
-
Utilization 资源的利用情况(包括硬件资源和软件资源)
-
Throughput 吞吐量(指每秒事务数)
-
Response Time 响应时间
-
Number of Concurrent Users 坐标轴的横轴从左到右表现了并发用户数的不断增长
3.1 阶段划分
-
开始阶段 随着并发用户数的增长,资源占用率和吞吐量会相应的增长,但是响应时间的变化不大
-
中间阶段 当并发用户数增长到一定程度后,资源占用达到饱和,吞吐量增长明显放缓甚至停止增长,而响应时间却进一步延长
-
末尾阶段 如果并发用户数继续增长,软硬件资源占用继续维持在饱和状态 但吞吐量开始下降,响应时间明显的超出了用户可接受的范围,并且最终导致用户放弃了这次请求甚至离开
3.2 区域划分
-
Light Load 较轻的压力
-
Heavy Load 较重的压力
-
Buckle Zone 用户无法忍受并放弃请求
3.3 衍生概念
根据区域交界处,又衍生两个概念:
-
最佳并发用户数 The Optimum Number of Concurrent Users Light Load和Heavy Load 两个区域交界处的并发用户数
-
最大并发用户数 The Maximum Number of Concurrent Users Heavy Load和Buckle Zone两个区域交界处的并发用户数
3.4 模型总结
-
系统的负载等于最佳并发用户数 系统的整体效率最高,没有资源被浪费,用户也不需要等待
-
系统负载处于最佳并发用户数和最大并发用户数之间 系统可以继续工作,但是用户的等待时间延长,满意度开始降低,并且如果负载一直持续,将最终会导致有些用户无法忍受而放弃
-
系统负载大于最大并发用户数 导致某些用户无法忍受超长的响应时间而放弃
3.5 结合场景
-
每小时都有3个顾客到来 理发店的整体工作效率最高,每小时3个顾客就是这个理发店的最佳并发用户数
-
每小时都有9个顾客到来 前几个小时来的顾客还可以忍受,但是随着等待的顾客人数越来越多,等待时间越来越长,最终还是会有顾客无法忍受而离开,每小时9个顾客则是它的最大并发用户数
随着理发店里顾客人数的增多和理发师工作时间的延长,理发师会逐渐产生疲劳,还要多花一些时间来清理环境和维持秩序,这些因素将最终导致理发师的工作效率随着顾客人数的增多和工作的延长而逐渐的下降,到最后可能要1.5小时甚至2个小时才能剪完1个发
四、用户数
进一步阐述最佳并发用户数和最大并发用户数
对于一个确定的被测系统来说,在某个具体的软硬件环境下,它的最佳并发用户数和最大并发用户数都是客观存在
4.1 最佳用户数
假设一个系统的最佳并发用户数是x,一旦并发量超过这个值,系统的吞吐量和响应时间必然会 此消彼长 如果系统负载长期大于这个数,必然会导致用户的满意度降低并最终达到一种无法忍受的地步 保证最佳并发用户数要大于系统的平均负载
思考: 当需要对一个系统长时间施加压力(如7*24),验证系统的可靠性或者说稳定性时,使用的并发用户数应该等于或小于最佳并发用户数,原因是?
4.2 最大用户数
超时时间限度 这个时间限度来源于性能需求
- 在某个级别的负载下,某系统的响应时间应该小于5s
- 在某个级别的负载下,某基础微服务响应时间应该小于60ms
最大用户数节点 不要把顾客因为无法忍受而离开时店内的顾客数量作为理发店的最大并发用户数,因为这位顾客是在3小时前到达的,也就是说3小时前理发店内的顾客数量才是我们要找的最大并发用户数 这位顾客的离开只是一个开始,可能有会更多的顾客随后也因为无法忍受超长的等待时间而离开
用户容量 在响应时间还没有到达用户可忍受的最大限度前,有可能已经出现了用户请求的失败 以理发店模型为例: 如果理发店只能容纳6位顾客,当7位顾客同时来到理发店时,虽然所有顾客都能在可容忍的时间内剪完头发,但是因为理发店容量有限,最终只好有一位顾客打道回府,改天再来
对于一个系统来说,我们应该确保:
- 最佳并发用户数要大于系统的平均负载
- 最大并发用户数要大于系统需要承受的峰值负载
五、扩展思考
针对理发店模型的扩展,如何将这些扩展与性能测试以及性能解决方案等方面关联起来
5.1 扩展场景1
- 场景
有些理发店的老顾客和理发师非常熟悉,理发师不用花费时间沟通就知道这位顾客的想法,并且理发师对这位顾客的脑袋形状等很熟悉,可以更快的完成一次理发的工作
- 系统
类比于系统的缓存
5.2 扩展场景2
- 场景
问题: 理发店并不仅仅剪发一种业务,还提供烫发染发等业务,随着烫发和染发业务的增加,理发师服务一位顾客的时间可能会超过标准的1小时,有些顾客的排队时间会比原来预计的延长,并最终导致他们因无法忍受而离开 解决: 理发师们决定分工,两位专门剪发,一位专门负责烫发和染发
- 系统
理发师们的分工就是在对服务器处理不同请求的分工,b/s系统的一个缩影 随着用户流量的提升,提供功能的丰富,系统的整体架构需要发生相应的改变,以满足用户的需求
5.3 扩展场景3
- 场景
问题: 理发店的生意越来越好,理发师的数量和理发店的门面已经无法满足顾客的要求 解决: 理发店老板决定在旁边再开一家店,并招聘一些工作能力更强的理发师
- 系统
一个CPU相当于一个理发师,那么一个服务器又有几个CPU 当业务扩展的时候,需要增加CPU,再增长的时候需要增加服务器
5.4 扩展场景4
- 场景
问题: 理发店的生意变得极为火爆了,两家店都无法满足顾客数量增长的需求,并且有些顾客开始反映到理发店的路途太远,到了以后又因为烫发和染发的人太多而等太久 解决: 理发店的老板明白烫发和染发的收入要远远高于剪发,于是决定继续改变策略
- 在附近的几个大型小区租用小的铺面开设分店,专职剪发业务
- 在市区的繁华路段开设旗舰店,专门为烫发、染发的顾客,以及VIP顾客服务
- 增设800电话,当顾客想要剪发时拨打电话,并由服务人员根据顾客居住地点,将其指引到距离最近的一家分店
- 系统
- 业务达到一定的水准的时候分成专门的服务器提供具体的服务
- 针对不同的用户的性能需求将功能模块拆解
- 电话相当于域名解析服务器,根据不同的提交服务转到不同的服务器