我们这里谈到的性能测试包括性能度量和性能优化两部分,此篇主要关注性能的度量。将来会有单独一篇专题来讲述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)等一些实践。
分享到:
- 2009-07-13 01:17
- 浏览 765
- 评论(1)
- 论坛回复 / 浏览 (1 / 2043)
- 查看更多
相关推荐
Rails::API 是 Rails 的精简版本,针对不需要使用完整 Rails 功能的开发者。 Rails::API 移除了 ActionView 和其他一些渲染功能,不关心Web前端的开发者可更容易、快速地开发应用程序,因此运行速度比正常的 Rails ...
使用Rails构建可伸缩和可维护API的最佳方法
Rails :: Controller :: Testing 这个gem将assigns给控制器测试的内容以及assert_template带回assigns控制器和集成测试的内容。 这些方法已中。 安装 将此行添加到您的应用程序的Gemfile中: gem 'rails-...
Rails :: Dom :: Testing 这个gem负责比较HTML DOM并断言Rails应用程序中存在DOM元素。 assert_dom_equal通过assert_dom_equal和assert_dom_not_equal进行比较。 元素通过assert_dom , assert_dom_encoded , ...
Ruby.on.Rails.Tutorial,Learn.Web.Development.with.Rails,Third.Edition-中文版 文字版.pdf 个人收集电子书,仅用学习使用,不可用于商业用途,如有版权问题,请联系删除!
NULL 博文链接:https://lzqustc.iteye.com/blog/439128
rails_best_practices是用于检查Rails代码质量的代码度量工具。 它支持以下ORM / ODM: 活动记录 蒙古型 mongomapper 以及以下模板引擎: erb 哈姆 减肥 拉布尔 rails_best_practices支持Ruby 1.9.3或更高版本...
chef-rails, 厨房设置一个可以与 Nginx 和 Rails 一起滚动的Ubuntu服务器 主厨 rails安装一个准备为 Ruby on Rails 栈准备的Ubuntu服务器:NginxPostgreSQLRedisMemcached带RVM的rubyPhusion乘客独立要求Ubuntu ...
rails5-docker-alpine:使用Alpine Linux的Rails轻量级Docker开发环境
minitest-rails, Rails的Minitest集成 minitestRails 5的Minitest集成 安装gem install minitest-rails这将安装以下宝石:minitest配置创建一个新的Rail
迷你轨道与Rails 6.1的Minitest集成安装gem install minitest-rails 这将安装以下gem: minitest配置创建一个新的Rails应用程序: rails new MyApp 选择一个版本如果您正在运行Rails 6.x,请在Gemfile中指定相应的6....
webpack-rails, 将 web pack与你的Ruby on Rails 应用程序集成 不再维护webpack-rails 不再被维护。 有关详细信息,请参阅 #90. web pack-railsweb pack 为你提供了将 web pack集成到现有的Ruby on Rails 应用程序中...
Rails Admin枚举4 Rails Admin插件,用于正确查看Rails 4.1枚举 安装 gem 'rails_admin_enum4', github: 'sibext/rails_admin_enum4' bundle install 用法 通过生成器生成新模型: rails g model Sibext service:...
[Pragmatic Bookshelf] Crafting Rails Applications Expert Practices for Everyday Rails Development (E-Book) ☆ 图书概要:☆ Rails 3 is a huge step forward. You can now easily extend the framework, ...
提供用于Rails 4.x(及更高版本)资产管道的Sprockets实现。 安装 gem 'sprockets-rails' , :require => 'sprockets/railtie' 或者,如果禁用了Bundler自动请求功能,则在config/application.rb require 'sprockets...
Ruby on Rails Guides_ A Guide to Testing Rails Applications.pdf
SEO 和 Ruby On Rails 由的SEO代理制作的示例应用程序,用于将Rails设置为SEO友好。教程您可以在找到教程,或在。安装 git clone git@github....
一个项目模板,用于为AWS Lambda快速创建一个新的Rails应用程序。 细节: Ruby 2.7运行时上的Railsv6.x。 集成JavaScript开发。 使用LibSass&Webpacker编译CSS / JS资产。 没有ActiveRecord。 阅读我们的指南...
《Rails之道》按照Rails的各个子系统进行组织编排,分别介绍了Rails的环境、初始过程、配置和日志记录,Rails的分配器、控制器、页面生成和路由,REST、资源和Rails,ActiveRecord的基础、关联、验证和高级技巧,...
graphql-rails-generators 一些生成器可以轻松将Rails模型与集成。 我之所以创建它,是因为我浪费了太多的按键来手动复制模型架构以创建graphql类型。 该项目包含用于查看ActiveRecord模型架构的生成器,并为您...