原创作者: andyhu1007   阅读:2161次   评论:0条   更新时间:2011-05-26    

我们这里谈到的性能测试包括性能度量和性能优化两部分,此篇主要关注性能的度量。将来会有单独一篇专题来讲述rails web应用程序的性能优化。

 

为什么要做性能测试

 

显而易见,对于一个web应用来讲,性能是重中之重。这直接关系到产品上线之后产品能否满足现实环境对性能的需求。而对于一个交付产品而言,客户对性能提出的实实在在的”数据要求“,是性能测试以及优化的目标。

 

什么时候做性能测试

 

很多人以为性能测试是项目的最后一步,这其实是不正确的想法。

 

如果有条件,性能测试应该尽早做,并且持续地做。

 

尽早做

 

在项目的早期就建立起对产品性能的标准,这会指导我们在做任何决策的时候都会把性能需求考虑进去。

 

到最后才做性能测试的代价是很大的,很可能意味着架构设计的巨大改变,而在这时候再来做改变的难度较之早期已经不仅仅是量级的增加。

 

在最后做一些巨大的改变,也意味着风险的急剧增加,以及其它一些工作量的重新投入,比如功能的重新测试等等。

 

持续做

 

性能测试应该持续不断地做。个人觉得,理想中它应该是持续集成的一部分,但又不应该具有和其它持续集成部分比如单元测试一样苛刻的pass策略,因为性能跟环境的相关性比较高。但让它成为持续集成的一部分,以跟踪性能的变化,同时也是性能改进的一个重要帮助数据。

 

但基于每个iteration做一次严格的性能度量和性能优化是必要的。在迭代后期做性能度量,发现那些不能满足性能需求的地方;同时,对两个迭代之间的性能做一个环比比较,研究并改进性能下降的地方。

 

性能测试之分类

 

一般我们所说的性能测试是load test(负载测试),但性能测试还有其它分类,包括stress test(压力测试),endurance test(耐力测试),spike test(尖峰测试),scalibility test(可伸缩性测试)等。各种测试的目的都不同,但都可以理解为是负载测试之衍生。

 

负载测试,是用来测试系统是否能在一定的负载之下正常运作。负载可以是在一定数量的并发以及指定的时间内,执行设定的一系列操作。通过负载测试,我们可以得到系统的性能结果,并发现系统的性能瓶颈。

 

再来看一下其它各种测试的测试目的。

 

我们不仅需要关心系统在正常负载之下的运行情况,还需要关心系统是否能承受高压,在什么样的高压之下,系统会break?测试系统的健壮性,这就是压力测试的目的。

 

有可能在很短的时间内,系统可以支撑起目前的负载,但我们并不知道长期运行时,系统会否出现问题,比如内存泄露等。所以,我们需要耐力测试。

 

同时,性能系统的运行期间,负载肯定不会是平稳的。在某些时候,系统的负载会出现一些巨大的变化,达到峰值。这就是尖峰测试的目的。

 

系统目前的性能可能已经满足了当前的需求,但随着用户数的增加,访问量的增长,系统需要继续保持良好的性能。这时候,我们往往会通过增加一些服务器等手段来进行扩展。但系统的性能是否会随着服务器的增多而线性提升呢?所以,我们需要可伸缩性测试来帮助我们进行分析。可伸缩性测试,通过线性地增加负载,得到测试结果数据;并分析测试结果是否也是线性增长。如果是,则说明系统具有良好的可伸缩性;如果不是,则说明系统具有较差的可伸缩性,甚者没有可伸缩性。

 

 

性能测试的结果

 

单于负载测试而言,我们需要的主要结果包括:吞吐量和平均响应时间。吞吐量指的是系统在一定的时间内可以处理的请求数量;平均响应时间指的是请求的响应时间平均值。而这两个结果是互相影响的,要增加吞吐量,也意味着响应时间会增长。

 

如果是一个交付项目,我们从客户处得到的数据一般是:系统的访问量,系统每个页面的响应时间。从这两个数据,我们可以计算出系统所需满足的吞吐量和平均响应时间。在设定好吞吐量之后(一定时间内多少并发数),通过性能测试我们就可以得到平均响应时间。通过持续不断地改进,缩短平均响应时间以满足系统的性能指标。

 

 

怎么做性能测试

 

最后,让我们看一下如何做性能测试。

 

这里讲的怎么做,不是具体的操作,而是在做性能测试时需要把握的原则和应该注意的问题。

 

对于性能测试而言,不同的环境,不同的测试方法可能会导致截然不同的结果。我们要得到对我们真实有用的数据,必须保证:

 

1. 被测系统的环境和产品环境要尽量保持一致。这里的环境指的是被测系统部署环境的服务器数量,服务器性能等。

 

2. 保持和产品数据库一致的数据规模。不同的数据规模,会导致测试结果的截然不同。如果无法保持数据的完全一致,至少得保持数据规模在量上的相当。

 

3. 模拟尽量一致的用户行为。比如,用户到了注册页面,接下来基本上都是注册,并提交。这应该是大部分用户的一个顺序执行的行为。不同的用户行为,会导致不同的数据读写,不同的性能需求。所以,应该在测试脚本里模拟和真实环境尽量一致的普遍用户行为。

 

 

性能测试工具

 

性能测试工具有很多,对于负载测试而言,流行的工具是jmeter。几年没有用,突然发现它已经变得非常强大和易用。

 

有兴趣的自己去学吧:http://jakarta.apache.org/jmeter/

 

 

-----------------------------------------------------------------------------------------------------------------

 

下篇预告:Performance Testing之优化

 

负载均衡,rails优化,数据库(分表,索引),Cache(客户端cache,服务端cache)等一些实践。

评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

文章信息

  • andyhu1007在2009-07-14创建
  • andyhu1007在2011-05-26更新
  • 标签: rails, performance testing
Global site tag (gtag.js) - Google Analytics