在国内性能测试的领域有一篇几乎被奉为大牛之作的经典文章,一个名叫Eric Man Wong 于2004年发表了名为《Method for Estimating the Number of Concurrent Users》,里面介绍了一种对系统并发用户数估算的公式,并较为详细的阐述了过程以及证明方法。这个公式使用非常简单,很多性能测试工程师都在自己的项目中使用或者打算尝试使用,以至于在不分场合以及不具体分析系统用户行为的情况下使用。本文不打算深入探讨该公式的适用范围,我会在以后的文章中探讨这个问题。
我并不否定该公式在文章中作者指定条件下的正确性,它在一定程度上帮助我从另外一种思路考虑系统的性能模型,同时通过对性能工程的学习我发现该估算公式与Little定律尽然是等价的。
下面回顾下Eric是怎么得出这个公式的,根据原文的意思大概是这样:
首先我们知道在系统中占用系统资源的都是在系统正在活动的用户,也就是所谓的并发用户,对于但是并不是出于系统中的用户比如刚登出或者还没来得及登入的用户是不会消耗系统资源的,所以当我们想测量系统的容量时,这部分用户不需要考虑,可以只考虑当前出于系统中的活跃用户。
然后文章引入了一个login session的概念,当然这个东西是一直有的,但本文需要用到所以特别指明是它是等同于用户登出系统时与登入系统时的这段时间差,也就是session的生存周期。
文章中这个图很好的描述了系统在处理陆续到达用户时的系统某一时刻的状态,以及诠释通过计算并发用户数统计系统性能的概念或者思想。
最终得出C=nL/T.
证明过程以及后面的详述不表。
接着再来看看什么是Little定律。
说实话这个定律应该是一个最基本的,也是在很多领域中已经广泛应用的定律,但是在国内性能测试领域出现的频率却不高。
直接借用《Programing Pearls 》的翻译:
大多数的估算都遵循这样一个浅显的法则:总花费就等于每个部分的花费再乘以总的部分数。但某些时候我们还需要更深入地了解细节。俄亥俄州立大学的Bruce Weide就一条通用得出奇的规则写下如下文字。
Denning和Buzen引入的"操作分析"(参见Computing Surveys 10第3期,1978年11月,第225~261页)比计算机系统队列网络模型更加通用。他们的展示相当精彩,不过由于文章主题的限制,他们并未深入揭示Little定律的通用性。他们的证明方法与队列和计算机系统都没有关系。想象一个任意的、有某些东西进入和离开的系统。Little定律可以表述为"系统中的东西的平均数目等于这些东西离开系统的平均速度乘以每个东西离开系统所花费的平均时间"。(若系统的总体出入流是平衡的,离开速率也就是进入速率。)
在建立性能模型时,一般是常使用如下公式表述Little定律:
N=X*R
N 表示系统中同时活动的用户,包括正在处理中和队列中的
X表示用户相继到达系统的速率,在平衡状态时即为系统吞吐量(到达=离开)
R表示每个用户在系统中平均的驻留时间
也就是说系统中平均同时被服务的用户数量等于用户到达系统的速度*每个用户在系统中待的时间
这条定律非常实用也具有很广的适用性,举一个例子:
比如说,你正在排队等待进入一个很受欢迎的夜总会,你可以通过估计人们进入的速率来知道自己还要等待多长时间。应用Little定律,你可以推理:"这个地方差不多能容纳60人,平均在里面呆的时间是3个小时,所以我们以每小时20人的速度进入。而我们前面还有20个人,所以我们还要等上一个小时。
上面的例子可以用公式进一步表述:
R=3 hours
X=20 人/hour
So N=3 hours * 20 人/hour=60 人,该夜总会能同时容纳60人
大家可以比较以上两种方法和定律,他们的表述是完全不同的,计算所需要的变量也不一样,但是经过下面的case后会有让你惊奇的发现。
Case:
有一个论坛系统,每天的活跃用户有500,用户活跃时间主要集中在晚上7点到12点,平均每人登入登出一次,登陆时长为30分钟,请为该系统建立性能测试模型。
使用Eric的估算公式解:
假设系统后端维护session,那么这个session的长度即为30分钟,L=30minutes
用户活跃时长已经得知是从7点到12点共五个小时,T=5 hours
那么并发用户数C=n*L/T=500*30/(5*60)=50
同时我们也可以使用Little定律对系统并发用户数进行估算:
500个用户需要在7点到12点这段时间陆续登入论坛可知,到达率X=500/(5*60)= 5/3 个用户/分钟
登陆时长30分钟为用户在系统中的驻留时间,R=30分钟
那么系统中同时被服务也就是并发数N=X*R=5/3 *30=50
看似两种全完不同的方法计算出来的结果完全一样,是巧合吗?或者一题多解?
我们再来从另外的角度分解Eric的估算公式:
C=n*L/T 可以表示为 C=(n/T)*L
n/T 是不是和我们刚才在上面Little中第一步一样,是计算到达率X的。
而L不就是R吗?都等同于session的长度。
也就是说C=(n/T)*T=X*R=N
结论:由以上得知,Eric's 估算公式跟Little定律是等价的. 同时读者可以自己看看他们各自的证明过程,有一定的相似性。
我们也可以在能适用的范围内放心使用这两种估算方法,以节约资源和时间。
Reference :
http://www.ece.virginia.edu/mv/edu/715/lectures/littles-law/littles-law.pdf
http://emiraga.wikispaces.com/file/view/Littles.law.January.2009.pdf