对性能测试的思考------理发店模型 (转载)
[b][url=http://www.cnblogs.com/jackei/admin/EditPosts.aspx?postid=565527#_%E8%BF%9B%E4%B8%80%E6%AD%A5%E7%90%86%E8%A7%A3%E2%80%9C%E6%9C%80%E4%BD%B3%E5%B9%B6%E5%8F%91%E7%94%A8%E6%88%B7%E6%95%B0%E2%80%9D%E5%92%8C%E2%80%9C%E6%9C%80%E5%A4%A7%E5%B9%B6%E5%8F%91%E7%94%A8%E6%88%B7%E6%95%B0%E2%80%9D][font=宋体][color=#1d58d1]进一步理解“最佳并发用户数”和“最大并发用户数”[/color][/font][/url][/b][b][url=http://www.cnblogs.com/jackei/admin/EditPosts.aspx?postid=565527#_%E7%90%86%E5%8F%91%E5%BA%97%E6%A8%A1%E5%9E%8B%E7%9A%84%E8%BF%9B%E4%B8%80%E6%AD%A5%E6%89%A9%E5%B1%95][font=宋体][color=#1d58d1]理发店模型的进一步扩展[/color][/font][/url][/b]
[b][url=http://www.cnblogs.com/jackei/admin/EditPosts.aspx?postid=565527#_%E5%8F%82%E8%80%83%E8%B5%84%E6%96%99][font=宋体][color=#1d58d1]相关资料[/color][/font][/url][/b]
[font=宋体]相信大家都进过或见过理发店,一间或大或小的铺面,[/font]1[font=宋体]个或几个理发师,几张理发用的椅子和供顾客等待的长条板凳。[/font]
[font=宋体][img=338,480]http://www.cnblogs.com/images/cnblogs_com/jackei/22605/o_Tom%20Quick%20barbershop.jpg[/img]
在我们的这个理发店中,我们事先做了如下的假设:
[/font]
1.
[font=宋体]理发店共有[/font]3[font=宋体]名理发师;[/font]
2.
[font=宋体]每位理发师剪一个发的时间都是[/font]1[font=宋体]小时;[/font]
3.
[font=宋体]我们顾客们都是很有时间观念的人而且非常挑剔,他们对于每次光顾理发店时所能容忍的等待时间[/font]+[font=宋体]剪发时间是[/font]3[font=宋体]小时,而且等待时间越长,顾客的满意度越低。如果[/font]3[font=宋体]个小时还不能剪完头发,我们的顾客会立马生气的走人。[/font]
[font=宋体]通过上面的假设我们不难想象出下面的场景:[/font]
1.
[font=宋体]当理发店内只有[/font]1[font=宋体]位顾客时,只需要有[/font]1[font=宋体]名理发师为他提供服务,其他两名理发师可能继续等着,也可能会帮忙打打杂。[/font]1[font=宋体]小时后,这位顾客剪完头发出门走了。那么在这[/font]1[font=宋体]个小时里,整个理发店只服务了[/font]1[font=宋体]位顾客,这位顾客花费在这次剪发的时间是[/font]1[font=宋体]小时;[/font]
2.
[font=宋体]当理发店内同时有两位顾客时,就会同时有两名理发师在为顾客服务,另外[/font]1[font=宋体]位发呆或者打杂帮忙。仍然是[/font]1[font=宋体]小时后,两位顾客剪完头发出门。在这[/font]1[font=宋体]小时里,理发店服务了两位顾客,这两位顾客花费在剪发的时间均为[/font]1[font=宋体]小时;[/font]
3.
[font=宋体]很容易理解,当理发店内同时有三位顾客时,理发店可以在[/font]1[font=宋体]小时内同时服务三位顾客,每位顾客花费在这次剪发的时间仍然是均为[/font]1[font=宋体]小时;[/font]
[font=宋体]从上面几个场景中我们可以发现,在理发店同时服务的顾客数量从[/font]1[font=宋体]位增加到[/font]3[font=宋体]位的过程中,随着顾客数量的增多,理发店的整体工作效率在提高,但是每位顾客在理发店内所呆的时间并未延长。[/font]
[font=宋体]当然,我们可以假设当只有[/font]1[font=宋体]位顾客和[/font]2[font=宋体]位顾客时,空闲的理发师可以帮忙打杂,使得其他理发师的工作效率提高,并使每位顾客的剪发时间小于[/font]1[font=宋体]小时。不过即使根据这个假设,虽然随着顾客数量的增多,每位顾客的服务时间有所延长,但是这个时间始终还被控制在顾客可接受的范围之内,并且顾客是不需要等待的。[/font]
[font=宋体]不过随着理发店的生意越来越好,顾客也越来越多,新的场景出现了。假设有一次顾客[/font]A[font=宋体]、[/font]B[font=宋体]、[/font]C[font=宋体]刚进理发店准备剪发,外面一推门又进来了顾客[/font]D[font=宋体]、[/font]E[font=宋体]、[/font]F[font=宋体]。因为[/font]A[font=宋体]、[/font]B[font=宋体]、[/font]C[font=宋体]三位顾客先到,所以[/font]D[font=宋体]、[/font]E[font=宋体]、[/font]F[font=宋体]三位只好坐在长板凳上等着。[/font]1[font=宋体]小时后,[/font]A[font=宋体]、[/font]B[font=宋体]、[/font]C[font=宋体]三位剪完头发走了,他们每个人这次剪发所花费的时间均为[/font]1[font=宋体]小时。可是[/font]D[font=宋体]、[/font]E[font=宋体]、[/font]F[font=宋体]三位就没有这么好运,因为他们要先等[/font]A[font=宋体]、[/font]B[font=宋体]、[/font]C[font=宋体]三位剪完才能剪,所以他们每个人这次剪发所花费的时间均为[/font]2[font=宋体]小时——包括等待[/font]1[font=宋体]小时和剪发[/font]1[font=宋体]小时。[/font]
[font=宋体]通过上面这个场景我们可以发现,对于理发店来说,都是每小时服务三位顾客——第[/font]1[font=宋体]个小时是[/font]A[font=宋体]、[/font]B[font=宋体]、[/font]C[font=宋体],第二个小时是[/font]D[font=宋体]、[/font]E[font=宋体]、[/font]F[font=宋体];但是对于顾客[/font]D[font=宋体]、[/font]E[font=宋体]、[/font]F[font=宋体]来说,“响应时间”延长了。如果你可以理解上面的这些场景,就可以继续往下看了。[/font]
[font=宋体]在新的场景中,我们假设这次理发店里一次来了[/font]9[font=宋体]位顾客,根据我们上面的场景,相信你不难推断,这[/font]9[font=宋体]位顾客中有[/font]3[font=宋体]位的“响应时间”为[/font]1[font=宋体]小时,有[/font]3[font=宋体]位的“响应时间”为[/font]2[font=宋体]小时(等待[/font]1[font=宋体]小时[/font]+[font=宋体]剪发[/font]1[font=宋体]小时),还有[/font]3[font=宋体]位的“响应时间”为[/font]3[font=宋体]小时(等待[/font]2[font=宋体]小时[/font]+[font=宋体]剪发[/font]1[font=宋体]小时)——已经到达用户所能忍受的极限。假如在把这个场景中的顾客数量改为[/font]10[font=宋体],那么我们已经可以断定,一定会有[/font]1[font=宋体]位顾客因为“响应时间”过长而无法忍受,最终离开理发店走了。[/font]
[font=宋体]我想并不需要特别说明,大家也一定可以把上面的这些场景跟性能测试挂上钩了。如果你还是觉得比较抽象,继续看下面的这张图[/font] ^_^
[font=宋体][img=942,592]http://www.cnblogs.com/images/cnblogs_com/jackei/33219/o_modified-001.jpg[/img][/font]
[font=宋体]这张图中展示的是[/font]1[font=宋体]个标准的软件性能模型。在图中有三条曲线,分别表示[b]资源的利用情况[/b]([/font][b]Utilization[/b][font=宋体],包括硬件资源和软件资源)、[b]吞吐量[/b]([/font][b]Throughput[/b][font=宋体],这里是指每秒事务数)以及[b]响应时间[/b]([/font][b]Response Time[/b][font=宋体])。图中坐标轴的横轴从左到右表现了[b]并发用户数[/b]([/font][b]Number of Concurrent Users[/b][font=宋体])的不断增长。[/font]
[font=宋体]在这张图中我们可以看到,最开始,随着并发用户数的增长,资源占用率和吞吐量会相应的增长,但是响应时间的变化不大;不过当并发用户数增长到一定程度后,资源占用达到饱和,吞吐量增长明显放缓甚至停止增长,而响应时间却进一步延长。如果并发用户数继续增长,你会发现软硬件资源占用继续维持在饱和状态,但是吞吐量开始下降,响应时间明显的超出了用户可接受的范围,并且最终导致用户放弃了这次请求甚至离开。[/font]
[font=宋体]根据这种性能表现,图中划分了三个区域,分别是[/font][b]Light Load[/b][font=宋体](较轻的压力)、[/font][b]Heavy Load[/b][font=宋体](较重的压力)和[/font][b]Buckle Zone[/b][font=宋体](用户无法忍受并放弃请求)。在[/font]Light Load[font=宋体]和[/font]Heavy Load [font=宋体]两个区域交界处的并发用户数,我们称为“[b]最佳并发用户数([/b][/font][b]The Optimum Number of Concurrent Users[/b][b][font=宋体])[/font][/b][font=宋体]”,而[/font]Heavy Load[font=宋体]和[/font]Buckle Zone[font=宋体]两个区域交界处的并发用户数则称为“[b]最大并发用户数([/b][/font][b]The Maximum Number of Concurrent Users[/b][b][font=宋体])[/font][/b][font=宋体]”。[/font]
[font=宋体]当系统的负载等于最佳并发用户数时,系统的整体效率最高,没有资源被浪费,用户也不需要等待;当系统负载处于最佳并发用户数和最大并发用户数之间时,系统可以继续工作,但是用户的等待时间延长,满意度开始降低,并且如果负载一直持续,将最终会导致有些用户无法忍受而放弃;而当系统负载大于最大并发用户数时,将注定会导致某些用户无法忍受超长的响应时间而放弃。[/font]
[font=宋体]对应到我们上面理发店的例子,每小时[/font]3[font=宋体]个顾客就是这个理发店的最佳并发用户数,而每小时[/font]9[font=宋体]个顾客则是它的最大并发用户数。当每小时都有[/font]3[font=宋体]个顾客到来时,理发店的整体工作效率最高;而当每小时都有[/font]9[font=宋体]个顾客到来时,前几个小时来的顾客还可以忍受,但是随着等待的顾客人数越来越多,等待时间越来越长,最终还是会有顾客无法忍受而离开。同时,随着理发店里顾客人数的增多和理发师工作时间的延长,理发师会逐渐产生疲劳,还要多花一些时间来清理环境和维持秩序,这些因素将最终导致理发师的工作效率随着顾客人数的增多和工作的延长而逐渐的下降,到最后可能要[/font]1.5[font=宋体]小时甚至[/font]2[font=宋体]个小时才能剪完[/font]1[font=宋体]个发了。[/font]
[font=宋体]当然,如果一开始就有[/font]10[font=宋体]个顾客到来,则注定有[/font]1[font=宋体]位顾客剪不到头发了。[/font]
[[i] 本帖最后由 周舟 于 2007-12-25 16:18 编辑 [/i]]
进一步理解“最佳并发用户数”和“最大并发用户数”
[size=3][font=宋体]进一步理解“最佳并发用户数”和“最大并发用户数”[/font][/size]在上一节中,我们详细的描述了并发用户数同资源占用情况、吞吐量以及响应时间的关系,并且提到了两个新的概念——“最佳并发用户数(The Optimum Number of Concurrent Users)”和“最大并发用户数(The Maximum Number of Concurrent Users)[font=宋体]”。在这一节中,我们将对“最佳并发用户数”和“最大并发用户数”的定义做更加清晰和明确的说明。[/font][font=宋体]对于一个确定的被测系统来说,在某个具体的软硬件环境下,它的“最佳并发用户数”和“最大并发用户数”都是客观存在。以“最佳并发用户数”为例,假如一个系统的最佳并发用户数是[/font]50[font=宋体],那么一旦并发量超过这个值,系统的吞吐量和响应时间必然会[/font]
[font=宋体]“此消彼长”;如果系统负载长期大于这个数,必然会导致用户的满意度降低并最终达到一种无法忍受的地步。所以我们应该[/font] 保证最佳并发用户数要大于系统的平均负载[font=宋体]。[/font]
[font=宋体]要补充的一点是,当我们需要对一个系统长时间施加压力——例如连续加压[/font]3-5[font=宋体]天,来验证系统的可靠性或者说稳定性时,我们所使用的并发用户数应该等于或小于“最佳并发用户数”——大家也可以结合上面的讨论想想这是为什么[/font] ^_^
[font=宋体]而对于最大并发用户数的识别,需要考虑和鉴别一下以下两种情况:[/font]
1.
[font=宋体]当系统的负载达到最大并发用户数后,响应时间超过了用户可以忍受的最大限度——这个限度应该来源于性能需求,例如:在某个级别的负载下,系统的响应时间应该小于[/font]5[font=宋体]秒。这里容易疏忽的一点是,不要把顾客因为无法忍受而离开时店内的顾客数量作为理发店的“最大并发用户数”,因为这位顾客是在[/font]3[font=宋体]小时前到达的,也就是说[/font]3[font=宋体]小时前理发店内的顾客数量才是我们要找的“最大并发用户数”。而且,这位顾客的离开只是一个开始,可能有会更多的顾客随后也因为无法忍受超长的等待时间而离开;[/font]
2.
[font=宋体]在响应时间还没有到达用户可忍受的最大限度前,有可能已经出现了用户请求的失败。以理发店模型为例,如果理发店只能容纳[/font]6[font=宋体]位顾客,那么当[/font]7[font=宋体]位顾客同时来到理发店时,虽然我们可以知道所有顾客都能在可容忍的时间内剪完头发,但是因为理发店容量有限,最终只好有一位顾客打道回府,改天再来。[/font]
[font=宋体]对于一个系统来说,我们应该[/font] 确保系统的最大并发用户数要大于系统需要承受的峰值负载[font=宋体]。[/font]
[font=宋体]如果你已经理解了上面提到的全部的概念,我想你可以展开进一步的思考,回头看一下自己以往做过的性能测试,看看是否可以对以往的工作产生新的理解。也欢迎大家在这里提出自己的心得或疑惑,继续讨论下去。[/font]
[font=宋体][size=3]理发店模型的进一步扩展[/size][/font][font=宋体]这一节中我会提到一些对理发店模型的扩展,当然,我依然是只讲述现实中的理发店的故事,至于如何将这些扩展同性能测试以及性能解决方案等方面关联起来,就留给大家继续思考了[/font] ^_^
扩展场景1[font=宋体]:有些顾客已经是理发店的老顾客,他们和理发师已经非常熟悉,理发师可以不用花费太多时间沟通就知道这位顾客的想法。并且理发师对这位顾客的脑袋的形状也很熟悉,所以可以更快的完成一次理发的工作。[/font]
扩展场景2[font=宋体]:理发店并不是只有剪发一种业务,还提供了烫发染发之类的业务,那么当顾客提出新的要求时,理发师服务一位顾客的时间可能会超过标准的[/font]1[font=宋体]小时。而且这时如果要计算每位顾客的等待时间就变得复杂了很多,有些顾客的排队时间会比原来预计的延长,并最终导致他们因为无法忍受而离开。[/font]
扩展场景3[font=宋体]:随着烫发和染发业务的增加,理发师们决定分工,两位专门剪发,一位专门负责烫发和染发。[/font]
扩展场景4[font=宋体]:理发店的生意越来越好,理发师的数量和理发店的门面已经无法满足顾客的要求,于是理发店的老板决定在旁边再开一家店,并招聘一些工作能力更强的理发师。[/font]
扩展场景5[font=宋体]:理发店的生意变得极为火爆了,两家店都无法满足顾客数量增长的需求,并且有些顾客开始反映到理发店的路途太远,到了以后又因为烫发和染发的人太多而等太久。可是理发店的老板也明白烫发和染发的收入要远远高于剪发阿,于是他脑筋一转,决定继续改变策略,在附近的几个大型小区租用小的铺面开设分店,专职剪发业务;再在市区的繁华路段开设旗舰店,专门为烫发、染发的顾客,以及[/font]VIP[font=宋体]顾客服务。并增设[/font]800[font=宋体]电话,当顾客想要剪发时,可以拨打这个电话,并由服务人员根据顾客的居住地点,将其指引到距离最近的一家分店去。[/font] 这个对于理解性能测试很有作用建议大家看一下 这个比喻倒是挺好的,但是我觉得理解用户并发倒不难,举例网络游戏什么的大家都理解,但是怎么做性能测试还是比较难的。 这个好像是Jackei老兄创造的,嘻嘻
比喻很精辟,容易理解!多谢
比喻很精辟,容易理解!多谢 有意思,容易理解,只是理发店相对于被测系统来说,不是那么有条理和规律性,要是能有更相符的比喻就更好了 容量理解,形象生动,对于初学者比较好 很好理解~~~~~1 太长了,兴趣不大.[zdy]tong 嗯,比喻是不错,呵呵。。。[zdy]face12 确实很容易理解,一看就懂
页:
[1]