大概在一年前的一次讨论中,个人好友陈华第一次提到了这个模型的最第一版本,通过几回讨论后,咱们发现通过完善和扩展的“理发店模型”能够用来帮助咱们理解不少性能测试的概念和理论,以及一些测试中遇到的问题。在最近的一次讨论后,我决定撰写一篇文章来专门讲述一下这个模型,但愿能够帮助你们更好的理解性能测试有关的知识。php
不过,在这篇文章中,我将会尽可能的只描述模型自己以及相关的一些扩展,而具体如何将这个模型彻底同性能测试关联起来,我不会所有说破,留下足够的空间让你们继续思考和总结,最好也一块儿来对这个模型作进一步的完善和扩展^_^ 我相信,当你们在思考的过程当中有所收获并有所突破时,那种快感和收获的喜悦才真的是让人倍感振奋并且终生难忘的 ^_^并发
固然,我要说明的是,这个模型仅仅是1个模型,它与你们实际工做中遇到的各式各样的状况未必均可以一一对应,可是大的方向和趋势应该是一致的。 性能
相信你们都进过或见过理发店,一间或大或小的铺面,1个或几个理发师,几张理发用的椅子和供顾客等待的长条板凳。测试
在咱们的这个理发店中,咱们事先作了以下的假设:spa
1. 理发店共有3名理发师;blog
2. 每位理发师剪一个发的时间都是1小时;事务
3. 咱们顾客们都是颇有时间观念的人并且很是挑剔,他们对于每次光顾理发店时所能容忍的等待时间+剪发时间是3小时,并且等待时间越长,顾客的满意度越低。若是3个小时还不能剪完头发,咱们的顾客会立马生气的走人。资源
经过上面的假设咱们不难想象出下面的场景:get
1. 当理发店内只有1位顾客时,只须要有1名理发师为他提供服务,其余两名理发师可能继续等着,也可能会帮忙打打杂。1小时后,这位顾客剪完头发出门走了。那么在这1个小时里,整个理发店只服务了1位顾客,这位顾客花费在此次剪发的时间是1小时;io
2. 当理发店内同时有两位顾客时,就会同时有两名理发师在为顾客服务,另外1位发呆或者打杂帮忙。仍然是1小时后,两位顾客剪完头发出门。在这1小时里,理发店服务了两位顾客,这两位顾客花费在剪发的时间均为1小时;
3. 很容易理解,当理发店内同时有三位顾客时,理发店能够在1小时内同时服务三位顾客,每位顾客花费在此次剪发的时间仍然是均为1小时;
从上面几个场景中咱们能够发现,在理发店同时服务的顾客数量从1位增长到3位的过程当中,随着顾客数量的增多,理发店的总体工做效率在提升,可是每位顾客在理发店内所呆的时间并未延长。
固然,咱们能够假设当只有1位顾客和2位顾客时,空闲的理发师能够帮忙打杂,使得其余理发师的工做效率提升,并使每位顾客的剪发时间小于1小时。不过即便根据这个假设,虽然随着顾客数量的增多,每位顾客的服务时间有所延长,可是这个时间始终还被控制在顾客可接受的范围以内,而且顾客是不须要等待的。
不过随着理发店的生意愈来愈好,顾客也愈来愈多,新的场景出现了。假设有一次顾客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来讲,“响应时间”延长了。若是你能够理解上面的这些场景,就能够继续往下看了。
在新的场景中,咱们假设此次理发店里一次来了9位顾客,根据咱们上面的场景,相信你不难推断,这9位顾客中有3位的“响应时间”为1小时,有3位的“响应时间”为2小时(等待1小时+剪发1小时),还有3位的“响应时间”为3小时(等待2小时+剪发1小时)——已经到达用户所能忍受的极限。假如在把这个场景中的顾客数量改成10,那么咱们已经能够判定,必定会有1位顾客由于“响应时间”过长而没法忍受,最终离开理发店走了。
我想并不须要特别说明,你们也必定能够把上面的这些场景跟性能测试挂上钩了。若是你仍是以为比较抽象,继续看下面的这张图 ^_^
这张图中展现的是1个标准的软件性能模型。在图中有三条曲线,分别表示资源的利用状况(Utilization,包括硬件资源和软件资源)、吞吐量(Throughput,这里是指每秒事务数)以及响应时间(Response Time)。图中坐标轴的横轴从左到右表现了并发用户数(Number of Concurrent Users)的不断增加。
在这张图中咱们能够看到,最开始,随着并发用户数的增加,资源占用率和吞吐量会相应的增加,可是响应时间的变化不大;不过当并发用户数增加到必定程度后,资源占用达到饱和,吞吐量增加明显放缓甚至中止增加,而响应时间却进一步延长。若是并发用户数继续增加,你会发现软硬件资源占用继续维持在饱和状态,可是吞吐量开始降低,响应时间明显的超出了用户可接受的范围,而且最终致使用户放弃了此次请求甚至离开。
根据这种性能表现,图中划分了三个区域,分别是Light Load(较轻的压力)、Heavy Load(较重的压力)和Buckle Zone(用户没法忍受并放弃请求)。在Light Load和Heavy Load 两个区域交界处的并发用户数,咱们称为“最佳并发用户数(The Optimum Number of Concurrent Users)”,而Heavy Load和Buckle Zone两个区域交界处的并发用户数则称为“最大并发用户数(The Maximum Number of Concurrent Users)”。
当系统的负载等于最佳并发用户数时,系统的总体效率最高,没有资源被浪费,用户也不须要等待;当系统负载处于最佳并发用户数和最大并发用户数之间时,系统能够继续工做,可是用户的等待时间延长,满意度开始下降,而且若是负载一直持续,将最终会致使有些用户没法忍受而放弃;而当系统负载大于最大并发用户数时,将注定会致使某些用户没法忍受超长的响应时间而放弃。
对应到咱们上面理发店的例子,每小时3个顾客就是这个理发店的最佳并发用户数,而每小时9个顾客则是它的最大并发用户数。当每小时都有3个顾客到来时,理发店的总体工做效率最高;而当每小时都有9个顾客到来时,前几个小时来的顾客还能够忍受,可是随着等待的顾客人数愈来愈多,等待时间愈来愈长,最终仍是会有顾客没法忍受而离开。同时,随着理发店里顾客人数的增多和理发师工做时间的延长,理发师会逐渐产生疲劳,还要多花一些时间来清理环境和维持秩序,这些因素将最终致使理发师的工做效率随着顾客人数的增多和工做的延长而逐渐的降低,到最后可能要1.5小时甚至2个小时才能剪完1个发了。
固然,若是一开始就有10个顾客到来,则注定有1位顾客剪不到头发了。
进一步理解“最佳并发用户数”和“最大并发用户数”
在上一节中,咱们详细的描述了并发用户数同资源占用状况、吞吐量以及响应时间的关系,而且提到了两个新的概念——“最佳并发用户数(The Optimum Number of Concurrent Users)”和“最大并发用户数(The Maximum Number of Concurrent Users)”。在这一节中,咱们将对“最佳并发用户数”和“最大并发用户数”的定义作更加清晰和明确的说明。
对于一个肯定的被测系统来讲,在某个具体的软硬件环境下,它的“最佳并发用户数”和“最大并发用户数”都是客观存在。以“最佳并发用户数”为例,假如一个系统的最佳并发用户数是50,那么一旦并发量超过这个值,系统的吞吐量和响应时间必然会 “此消彼长”;若是系统负载长期大于这个数,必然会致使用户的满意度下降并最终达到一种没法忍受的地步。因此咱们应该 保证最佳并发用户数要大于系统的平均负载。
要补充的一点是,当咱们须要对一个系统长时间施加压力——例如连续加压3-5天,来验证系统的可靠性或者说稳定性时,咱们所使用的并发用户数应该等于或小于“最佳并发用户数”——你们也能够结合上面的讨论想一想这是为何 ^_^
而对于最大并发用户数的识别,须要考虑和鉴别一下如下两种状况:
1. 当系统的负载达到最大并发用户数后,响应时间超过了用户能够忍受的最大限度——这个限度应该来源于性能需求,例如:在某个级别的负载下,系统的响应时间应该小于5秒。这里容易疏忽的一点是,不要把顾客由于没法忍受而离开时店内的顾客数量做为理发店的“最大并发用户数”,由于这位顾客是在3小时前到达的,也就是说3小时前理发店内的顾客数量才是咱们要找的“最大并发用户数”。并且,这位顾客的离开只是一个开始,可能有会更多的顾客随后也由于没法忍受超长的等待时间而离开;
2. 在响应时间尚未到达用户可忍受的最大限度前,有可能已经出现了用户请求的失败。以理发店模型为例,若是理发店只能容纳6位顾客,那么当7位顾客同时来到理发店时,虽然咱们能够知道全部顾客都能在可容忍的时间内剪完头发,可是由于理发店容量有限,最终只好有一位顾客打道回府,改天再来。
对于一个系统来讲,咱们应该 确保系统的最大并发用户数要大于系统须要承受的峰值负载。
若是你已经理解了上面提到的所有的概念,我想你能够展开进一步的思考,回头看一下本身以往作过的性能测试,看看是否能够对以往的工做产生新的理解。也欢迎你们在这里提出本身的心得或疑惑,继续讨论下去。
这一节中我会提到一些对理发店模型的扩展,固然,我依然是只讲述现实中的理发店的故事,至于如何将这些扩展同性能测试以及性能解决方案等方面关联起来,就留给你们继续思考了 ^_^
扩展场景1:有些顾客已是理发店的老顾客,他们和理发师已经很是熟悉,理发师能够不用花费太多时间沟通就知道这位顾客的想法。而且理发师对这位顾客的脑壳的形状也很熟悉,因此能够更快的完成一次理发的工做。
扩展场景2:理发店并非只有剪发一种业务,还提供了烫发染发之类的业务,那么当顾客提出新的要求时,理发师服务一位顾客的时间可能会超过标准的1小时。并且这时若是要计算每位顾客的等待时间就变得复杂了不少,有些顾客的排队时间会比原来预计的延长,并最终致使他们由于没法忍受而离开。
扩展场景3:随着烫发和染发业务的增长,理发师们决定分工,两位专门剪发,一位专门负责烫发和染发。
扩展场景4:理发店的生意愈来愈好,理发师的数量和理发店的门面已经没法知足顾客的要求,因而理发店的老板决定在旁边再开一家店,并招聘一些工做能力更强的理发师。
扩展场景5:理发店的生意变得极为火爆了,两家店都没法知足顾客数量增加的需求,而且有些顾客开始反映到理发店的路途太远,到了之后又由于烫发和染发的人太多而等过久。但是理发店的老板也明白烫发和染发的收入要远远高于剪发阿,因而他脑筋一转,决定继续改变策略,在附近的几个大型小区租用小的铺面开设分店,专职剪发业务;再在市区的繁华路段开设旗舰店,专门为烫发、染发的顾客,以及VIP顾客服务。并增设800电话,当顾客想要剪发时,能够拨打这个电话,并由服务人员根据顾客的居住地点,将其指引到距离最近的一家分店去。
这篇文章就先写到这里了,但愿你们在看完以后能够继续思考一下,也写出本身的心得体会或者新的想法,记下本身的不解和疑惑,让咱们在不断的交流和讨论中走的更远 ^_^