性能测试3 方法

要进行的性能测试的类型取决于想要达到的结果。例如,对于可再现性,基准测试是最好的方法。而要从当前用户负载的角度测试系统的上限,则应该使用容量规划测试。

如果不进行合理的规划进行性能测试将会是一项混乱的任务。因为对于任何的软件开发流程,都必须收集需求,理解业务需要,并在进行实际测试之前设计出正式的进度表。性能测试的需求由业务需要驱动,并由一组用例阐明。这些用例可以基于历史数据(例如服务器一周的负载模式)或预测的近似值。弄清楚需要测试的内容之后,就需要知道如何进行测试了。

在开发阶段前期,应该使用基准测试来确定应用程序中是否出现性能倒退。基准测试可以在一个相对短的时间内收集可重复的结果。进行基准测试的最好方法是,每次测试改变一个且只改变一个参数。

开发阶段后期,在应用程序中的bug已经被解决,应用程序达到一种稳定状态之后,可以运行更为复杂的测试,确定系统在不同负载模式下的表现。这些测试被称为容量规划测试、渗入测试(soak test)、峰谷测试(peak-rest test),它们旨在通过测试应用程序的可靠性、健壮性和可伸缩性来测试接近于现实世界的场景。

基准测试

基准测试的关键是要获得一致的、可再现的结果。可再现的结果有两个好处:减少重新运行测试的次数;对测试的产品和产生的数字更为确信。使用性能测试工具可能会对测试结果产生很大影响。假如测试的两个指标是服务器的响应时间和吞吐量,它们会受到服务器上的负载的影响。服务器上的负载受两个因素影响:同时与服务器通信的连接(或虚拟用户)的数目,以及每个虚拟用户请求之间的考虑时间的长短。很明显,与服务器通信的用户越多,负载越大。同样,请求之间的考虑时间越短,负载也越大。这两个因素的不同组合会产生不同服务器负载等级。随着服务器上负载的增加,吞吐量会不断攀升,直到到达一个点稳定下来。在某点上,执行队伍开始增长,因为服务器上所有的线程都已投入使用,传入的请求不再被处理,而是放入队列中,当线程空闲时再处理。最初的一段时间,执行队列的长度为零,然后就开始以稳定的速度增长。这是因为系统中的负载在稳定增长,虽然最初系统有足够的空闲线程区处理增加的负载,最终它还是不能承受,必须将其排入队列。当系统达到饱和点,服务器吞吐量保持稳定后,就达到了给定条件下的系统上限。但是随着服务器负载的增长,系统响应时间随之延长,虽然吞吐量保持稳定。

为了获得真正可再现的结果,应将系统置于相同的高负载下。为此,与服务器通信的虚拟用户应该将请求之间的考虑时间设为零。这样服务器会立即超载,并开始构建执行队列。如果请求(虚拟用户)数保持一致,基准测试的结果应该会非常精确,完全可以再现。对于一次给定的测试,应该取响应时间和吞吐量的平均值。精确获得这些值的唯一方法是一次加载所有用户,然后在预定的时间段内持续运行。这称为flat测试。

与此对应的时ramp-up测试,用户是交错上升的,每几秒增加一些新用户。Ramp-up测试不能产生精确和可重现的平均值,这是因为由于用户的增加时每次一部分,系统负载在不断地变化。因此flat测试时获得基准测试数据的理想模式。实际上,ramp-up测试对于找出以后要运行的flat测试的范围非常有用。Ramp-up测试的优点是,可以看出随着系统负载的改变,测量值是如何改变的。然后可以据此选择以后要运行的flat测试的范围。

Flat测试的问题是系统会遇到波动效果。波动出现后,吞吐量不再是平滑的。这在系统的各个方面都有所体现,包括CPU的使用量。此外执行队列也承受着不稳定的负载,因此可以看到,随着系统负载的增加和减少,执行队列也在增长和缩减。每隔一段时间就会出现一个波形,事物的响应时间也类似,只不过效果随着时间推移逐渐减弱。当测试中所有用户都执行几乎相同的操作时,就会发生这种现象。这将会产生非常不可靠和不精确的结果,所以必须采取一些措施防止这种情况的出现。有两种方法可以从这种类型的结果中获得精确的测量值。如果测试可以运行相当长的时间,最后由于随机事件的本性使然,服务器的吞吐量会被拉平。或者,可以只选取波形中两个平息点之间的测量值。该方法缺点是可以捕获数据的时间非常短。

 

性能规划测试

对于性能规划类型的测试来说,其目标是找出,在特定的环境下,给定的应用程序的性能可以达到何种程度。此时可重现性就不如在基准测试中那么重要了,因为测试中通常都会有随机因子。引入随机因子的目的是为了尽量模拟具有真实用户负载的现实世界应用程序。通常,具体目标是找出系统在特定的服务器响应时间下支持的当前用户的最大数。

要确定系统的容量,需要考虑几个因素。通常,服务器的用户总数非常大(以十万计),但是实际上,这个数字并不能说明什么。真正需要知道的是,这些用户中有多少是并发与服务器通信的。其次要知道的是,每个用户的考虑时间是多少。这非常重要,因为考虑时间越短,系统所支持的并发用户越少。在现实世界中,很难确定用户的考虑时间,通常用户也不会精确的按照时间间隔发出请求。

于是就引进了随机性。如果知道普通用户的考虑时间是5秒,误差20%,那么在设计负载测试时,就要确保请求的时间为5X(1+/-20%)秒。此外可以利用调步的理念向负载场景中引入更多的随机性。即在一个虚拟用户完成一整套的请求后,该用户暂停了一个设定的时间段,或者一个小的随机时间段,例如2X(1+/-25%)秒,然后再继续执行下一套请求。将这两种随机变化方法运用到测试中,可以提供更接近于现实世界的场景。

进行容量规划测试时,加载用户模拟负载状态的最好方法是模拟高峰时间用户与服务器通信的状况。这种用户负载状态是在一段时间内逐步达到的话则使用ramp-up类型的测试,否则用flat类型的测试。两种不同类型的测试会产生没有可比性的不同测试。例如,如果系统进行ramp-up测试,系统可以以每4秒或更短的响应时间支持5000用户。而执行flat测试,对于5000用户,系统的平均响应时间要大于4秒。这是由于ramp-up测试固有的不准确性使其不能显示系统可以支持的并发用户的精确数字。以门户应用程序为例,随着门户规模的扩大和集群规模的扩大,这种不确定性就会随之显现。这不是说不应该使用ramp-up测试。对于系统负载在一段比较长的时间内缓慢增加的情况,ramp-up测试效果还是不错的。这是因为系统能够随着时间不断调整。如果使用快速ramp-up测试,系统就会滞后,从而报告一个较相同用户负载的flat测试低的响应时间。那么,什么是确定容量的最好方法?结合两种负载类型的优点,并允许一系列的测试,就会产生最好的结果。例如,首先使用ramp-up测试确定系统可以支持的用户范围,确定范围后,以该范围内不同并发用户负载进行一系列的flat测试,更精确地确定系统容量。

 

渗入测试

渗入测试是一种比较简单的性能测试。渗入测试所需时间较长,它使用固定数目的并发用户测试系统的总体健壮性。这些测试将会通过内存泄露、增加的垃圾收集(GC)或系统的其他问题,显示因长时间运行而出现的任何性能降低。测试运行的时间越久,测试者就对系统越了解。可以运行两次测试,一次使用较低的负载(要在系统容量之下,以便不会出现执行队列),一次使用较高的负载(以便出现积极的执行队列)。

测试应该运行几天的时间,以便真正了解应用程序长期健康状况。要确保测试的应用程序尽可能接近现实世界真实情况,用户场景也要逼真(虚拟用户通过应用程序导航的方式要与现实世界一致),从而测试应用程序的全部特性。

 

峰谷测试

峰谷测试兼有容量规划ramp-up类型测试和渗入测试的特征。其目标是确定从高负载(例如系统高峰时间的负载)恢复、转为几乎空闲、然后再攀升到高负载、再降低的能力。实现这种测试的最好方法是,进行一系列的快速ramp-up测试,继之以一段时间的平稳状态(取决于业务需求),然后急剧降低负载,此时可令系统平息一下,然后再快速ramp-up。反复这个过程。这样可以确定两个事项:第二次高峰是否可重现第一次峰值?其后的每次高峰是等于还是大于第一次峰值?在测试过程中,系统是否显示了内存或GC性能降低的有关迹象。测试运行(不停重复峰值/空闲周期)的时间越长,就会对系统健壮性越了解。

posted @ 2014-03-13 18:40  平静缓和用胸音说爱  阅读(4512)  评论(0编辑  收藏  举报