在 LoadRunner 的运行场景中,有一个不大起眼的设置,可能常常会被不少人忽略,它就是Pacing 。具体设置方式为: Run-Time settings à General à Pacing ,这个设置的功能从字面上就很容易理解,即在场景的两次迭代 (iteration) 之间,加入一个时间间隔(步进)。设置方法也很简单,这里就不赘述了,我在这里想说明的是,这个设置到底有什么做用?为何要进行这个设置?说实话,虽然我在之前作过的一些性能测试中,偶尔会对这个步进值进行一些设置,但其实对它的真正含义和做用,我还并不十分清楚。 服务器
前段时间,我在对X银行招聘信息系统进行性能测试的时候,发现这个值的设置对于测试的结果有着很大的影响,很遗憾当时没有深刻研究这个问题,而只是简单地认为它同脚本中的 thinktime 同样只是为了更真实地模拟实际状况而已。最近在网络上看到一篇题为《调整压力测试工具》的文章,读完以后,再用以前个人测试经历加以印证,真有种豁然开朗的感受。如下就将个人一些体会与你们分享: 网络
一般咱们在谈到一个软件的“性能”的时候,首先想到的就是“响应时间”和“并发用户数”这两个概念。咱们看到的性能需求常常都是这样定义的: 并发
“要求系统支持 100 个并发用户” 工具
看到这样的性能需求,咱们每每会不假思索地就在测试场景中设置 100 个用户,让它们同时执行某一个测试脚本,而后观察其操做的响应时间,咱们都是这样作的,不是吗?我在实际实施性能测试的过程当中,也每每都是这样作的。惋惜的是,咱们中的大多数人不多去更深刻地思考一下其中的奥妙,包括我本身。 性能
事实上,评价一个软件系统的性能,能够从两个不一样的视角去看待:客户端视角和服务器视角(也有人把它叫作用户视角和系统视角),与此相对应的,又能够引出两个让初学者很容易混淆的两个概念:“并发用户数”和“每秒请求数”。“并发用户数”是从客户端视角去定义的,而“每秒请求数”则是从服务器视角去定义的。 测试
所以,上面所描述的作法的局限性就是,它反映的仅仅是客户端的视角。 spa
对于这个世界上的不少事情,变换不一样的角度去看它,每每能够有助于咱们获得更正确的结论。如今,咱们就转换一下角度,以服务器的视角来看看性能需求应该怎么样定义: 线程
“要求系统的事务处理能力达到 100 个 / 秒” ( 这里为了理解的方便,假定在测试脚本中的一个事务仅仅包含一次请求 ) 队列
面对以这样方式提出的性能需求,在 LoadRunner 中,咱们又该如何去设置它的并发用户数呢?千万不要想固然地觉得设置了 100 个并发用户数,它就会每秒向服务器提交 100 个请求,这是两个不一样的概念,由于 LoadRunner 模拟客户端向服务器发出请求,必须等待服务器对这个请求作出响应,而且客户端收到这个响应以后,才会从新发出新的请求,而服务器对请求的处理是须要一个时间的。咱们换个说法,对于每一个虚拟用户来讲,它对服务器发出请求的频率将依赖于服务器对这个请求的处理时间。而服务器对请求的处理时间是不可控的,若是咱们想要在测试过程当中维持一个稳定的每秒请求数( RPS ),只有一个方法,那就是经过增长并发用户数的数量来达到这个目的。这个方法看起来彷佛没有什么问题,若是咱们在测试场景中只执行一次迭代的话。然而有经验的朋友都会知道,实际状况并非这样,咱们一般会对场景设置一个持续运行时间(即屡次迭代),经过多个事务 (transaction)的取样平均值来保证测试结果的准确性。测试场景以迭代的方式进行,若是不设置步进值的话,那么对于每一个虚拟用户来讲,每个发到服务器的请求获得响应以后,会立刻发送下一次请求。同时,咱们知道, LoadRunner 是以客户端的角度来定义“响应时间”的 ,当客户端请求发出去后,LoadRunner 就开始计算响应时间,一直到它收到服务器端的响应。这个时候问题就产生了:若是此时的服务器端的排队队列已满,服务器资源正处于忙碌的状态,那么该请求会驻留在服务器的线程中,换句话说,这个新产生的请求并不会对服务器端产生真正的负载,但很遗憾的是,该请求的计时器已经启动了,所以咱们很容易就能够预见到,这个请求的响应时间会变得很长,甚至可能长到使得该请求因为超时而失败。等到测试结束后,咱们查看一下结果,就会发现这样一个很不幸的现象:事务平均响应时间很长,最小响应时间与最大响应时间的差距很大,而这个时候的平均响应时间,其实也就失去了它应有的意义。也就是说,因为客户端发送的请求太快而致使影响了实际的测量结果。 事务
所以,为了解决这个问题,咱们能够在每两个请求之间插入一个间隔时间,这将会下降单个用户启动请求的速度。间歇会减小请求在线程中驻留的时间,从而提供更符合现实的响应时间。这就是我在文章开头所提到的 Pacing 这个值的做用。
最后再补充一句话:虽然性能测试一般都是从客户端活动的角度定义的,可是它们应该以服务器为中心的视角来看待。请注意这句话,理解它很重要,只有真正理解了这句话,你才会明白为何咱们一直强调作性能测试的时候要保证一个独立、干净的测试环境,以及一个稳定的网络,由于咱们但愿评价的是软件系统真正的性能,因此必须排除其它一切因素对系统性能形成的影响。