● 如何估算并发

  那么我们如何来估算这个并发值呢?

  在此我们需要作出说明,一般我们需要的数据应该来自于实际数据(比如系统日志的记录),这样可靠,只有当系统新启动且无任何数据参考的时候我们才需要进行估算。

  比如我们测试地铁大厅的性能情况,该如何去估算当乘客进入大厅时,地铁大厅的性能呢?下面以笔者经常乘坐的地铁5号线立水桥南站为例进行估算,过程与数据仅供参考。

  假定每天从该站乘坐地铁的人数为5万人次,每天的早高峰为7-9点,晚高峰为6-7点,根据8/2原则,80%的乘客(人次)会在高峰期乘坐该站的地铁,则平均每秒到达地铁检票口的人数为(50000×80%)/(3×60×60) = 3.7~=4人,当然这个4人不能作为计算所用的并发值,因为对此时的受压入口检票口来说,4只是每秒到达的压力(即请求)数量,考虑到安检、入口关闭等因素,实际堆积在检票口的人数可能要大于这个数目,假定每个人需要3秒左右才能入站,则实际并发应该为(4人/秒)×3秒=12。当然我们必须指出,这种方法得到的情况并非极端值,因为即使作为早晚高峰,人数的分布也不是平均的(具体情况需要根据实际数据进行分析),但对大部分系统的大部分场景,我们可以用(用户总量/统计时间)×影响因子(一般为3,为经验系数)来进行估算。

  实际上,还有一种估算方法,而这种估算方法为国内众多书籍、文章反复转载,其来源与Eric Man Wong在2004年公布的一篇“论文”《Method for Estimating the Number of Concurrent Users》,其核心公式如下:

  C=nL/T

  其中,C代表在线用户,n代表执行事务的用户总数,L代表每用户的平均在线时间,T为待统计的总时间,依旧以地铁入站的情况进行估算,依旧考虑8/2原则,即n为50000*80%人,T为3小时,L即我们在地铁中停留的时间(从进站到上车),假定为5分钟,因此得到的公式为:

  C=(50000人×80%×5min)/3×60min = 1111

  并发数是1111,比前面一种算法要高的多,这是为什么呢?

  实际上,后面这种统计方法是由一定的局限性与适用范围的,对其统计的每个并发用户而言,每个用户所在线的时间(如上面的5min),并不一定是我们所需要的场景耗时,该5分钟应该是整个大场景(如从进站到离开),而我们通常所使用的场景往往包含了一连贯的子场景,如进站、等待、上车等,因此,如果我们测试的场景是某一个具体的动作,不建议采用这种公式(当然,如果单独为每个动作估算时间也是可以的。)

  从本质上来说,两种公式的统计,结果都是一样的,关键取决与统计口径。

  极限的问题也是我们需要考虑的,数据的估算往往是一个大的工程,涉及到很多复杂的情况,比如用户的进入与离开,人流异常等,因此我们考虑的多为常规的情况,在一些特殊的情况下,用户的峰值往往要大很多,此时需要去对极限情况下进行估算。

  此时的目的在于检查系统的极限承载情况,如列车大承载2000人,站内极限承载10000人是一样的,超出这个极限,需要采取一些紧急措施,比如限流(对应到普通的系统,是设置大连接数,超出的必须等待)之类。

  这种值的计算,不可能给出准确值,可以根据实际情况,协商而定,比如把经验系数更改为5,这种情况下,如果有日志或者统计数据予以支撑,会更加精确。

  ● 回答客户的疑惑

  面对客户,经常需要去解答一些问题,常见的几类疑惑如下:

  1、客户坚持要求并发2000,怎么办?

  这个问题非常关键,即上面所谓的阐述只是为了让大家对并发等概念有个大体的理

  解,但我们的工作重心不是一来跟客户讲理论,而是合理、有效、迅速地完成项目,因此,特别是一些项目的咨询阶段,如果客户坚持提出达到某个并发要求,我们首先需要看下这个情况产品能否支持,如果不支持,通过修改架构(比如增加服务器,公司的大部分产品都支持集群)来完成,如果还是没法达到要求,我们再来跟客户交流,从客户能理解的方式,从客户的角度去计算并发,后得到认可行了。当然,解决这些问题,需要我们对公司的产品性能基本比较了解(可以通过产品的性能测试报告来了解,质保将来会考虑出台所有产品的性能指标集合供参考),如果难度还是很大,可以申请质保的支持。大家一起去解决这个问题。