优化GC
了解了如何通过优化Ruby代码来提升我们的Rails应用性能,现在让我们更深入一些,来看看Ruby的内存管理和垃圾回收机制。
首先,由于Ruby最初的设计目标是成为像Perl那样的批处理语言,因此它的内存管理机制并没有针对Rails这样的需要长期运行的服务端程序进行最优化,有些地方甚至是背道而驰:
Ruby的内存管理策略是尽量减少内存占用;
标记和清除算法十分简单;
使用malloc来分配连续的内存块(Ruby heap);
复杂的数据结构;
C扩展十分容易编写,但是当前的C接口很难实现generational GC(关于generational GC请参看[4])。
其次,Ruby的垃圾回收机制对于Rails也不是最优的,由于Ruby的AST(抽象语法树)存储在堆上,并且在每次GC时都会被扫描一遍,而这恰恰是Rails中最大的一块非垃圾区,也就是说,GC对于Rails做的大部分工作都是在做无用功。
并且,Ruby的清除算法依赖于堆的大小,而不是当前非垃圾区的大小,但是堆的增长存在一定限制,只有当进行GC后,当前的freelist < FREE_MIN,堆才会增加,gc.c中定义的增加值为4096,这对于Rails来说明显太小了,堆应该至少能够容纳20万个对象。
要提高Ruby GC的性能,可以在Rails dispatcher中添加如下语句:
# excerpt from dispatch. Fcgi
RailsFCGIHandler.process! nil, 50
这句话将禁止Ruby GC运行,在处理50个请求后再启用GC,但是这个方法存在一个问题,它没法区分小请求和大请求,这有可能会导致:
堆变的过大
小页面的性能受损
如果运行GC之后仍然没有足够的内存,Ruby还是会释放堆上的block
除了控制GC的运行时机,我们还可以通过修改GC的参数来提升性能,但需要先给GC打补丁,下载最新的Railsbench,打上rubygc.patch补丁,然后重新编译并安装Ruby,就可以通过以下参数对GC进行调整了:
RUBY_HEAP_MIN_SLOTS, 初始堆大小,默认10000
RUBY HEAP FREE MIN,GC后可用的heap slot的最小值,默认4096
RUBY GC MALLOC LIMIT,允许不触发GC而分配的C数据结构的最大值(字节为单位),默认8,000,000
我们的推荐值为:
RUBY_HEAP_MIN_SLOTS = 600000
RUBY_GC_MALLOC_LIMIT = 60000000
RUBY_HEAP_FREE_MIN = 100000
如果你进行基准测试的话,就会发现性能提高不少。
优化模板
好了,最后我们再讲讲模板优化,对于许多在编译时就知道结果的helper方法,完全没有必要在每次处理请求时都进行解析,比如:
<%= end_form_tag %> ===> </form>
这纯粹就是浪费时间,还有我们前面提到的link_to,因此,如果我们可以在敲代码时确定这个helper的输出,那么最好直接写出结果。
另外,还可以使用Ryan Davis的ParseTree和ruby2ruby来获取ActionView的render方法的AST,并进行模板终极优化:
展开所有helper方法
去除不会调用到的代码
去除不会用到的变量(以及partials)
合并hash
替换常量
替换结果已确定的方法调用
替换符号
然后使用eval将新的AST编译入优化后的render方法。
参考:
[1] https://railsexpress.de/blog/files/slides/railsconf2006.pdf
[2] http://railsexpress.de/blog/articles/2006/05/29/simpler-piggy-backing
[3] http://www.letrails.cn/archives/18
[4] http://en.wikipedia.org/wiki/Garbage_collection_(computer_science)
分享到:
相关推荐
ruby on rails文档,rails3入门指南
详细介绍了rails性能优化的方方面面,对于性能调优有一定的帮助。
原文在此http://guides.ruby-china.org/index.html 我只是把html拷贝到word里面罢了 然而只拷贝到了Rails 安全指南这一章,后面的太多就没拷贝了 初学者只需打印到368页即可
meta-tags, 用于 Ruby on Rails 应用程序的搜索引擎优化( SEO ) 元标记:使你的Rails 应用程序搜索引擎友好的gem 用于 Ruby on Rails 应用程序的搜索引擎优化( SEO ) 插件。Rails 上的 rubyMetaTags主分支完全支持 ...
rails_apps_composer, 一个 gem,为 Rails 启动应用程序创建 Rails 应用程序模板 Rails 应用编辑器 Rails 应用程序编辑器 gem 安装一个 命令行 工具来从"食谱"的Collection 组装 Rails 应用程序。"你可以使用 rails_...
Ruby on Rails中文指南
rails指南 中文版
Rails 官方指南文档 5.0.1 中文版
复杂Rails系统架构优化
本文介绍如何开始使用Ruby on Rails,读完本文后,您将...如何安装Rails,创建Rails应用,如何连接数据库; Rails应用的基本文件结构; MVC(模型,视图,控制器)和REST架构的基本原理; 如何快速生成Rails应用骨架;
webpack-rails, 将 web pack与你的Ruby on Rails 应用程序集成 不再维护webpack-rails 不再被维护。 有关详细信息,请参阅 #90. web pack-railsweb pack 为你提供了将 web pack集成到现有的Ruby on Rails 应用程序中...
使用Aptana+Rails开发Rails Web应用 有Aptana的安装配置等等,中文
rails_standards, 构建 Rails 应用程序时要遵循的实践的开发人员指南 Rails 4. X 开发标准指南方法应用 YAGNI 和 KISS原则来实现所有的跟随。通用架构产品和API特性实现细节文档努力使代码成为自文档。在代码中首选...
rails-perftest, 测试和配置你的Rails 应用程序 性能测试 Rails 应用程序本指南介绍了 Ruby on Rails 应用程序性能测试的各种方法。阅读本指南后,你将知道:各种类型的基准测试和分析度量。如何生成性能和基准测试...
rails_layout, 为各种前端框架生成 Rails 应用程序布局文件 RailsLayout gem使用这里 gem 可以设置你选择的前端框架的布局文件:Zurb基础 5.3Bootstrap 4.0Bootstrap 3.3它还将为 Bootstrap 或者基础设置设计视图。...
karafka 基于Apache Kafka的Ruby和Rails应用程序开发框架
Rails Erd - 为Rails应用程序生成实体关系图
Google Sign-In for Rails 实现将Google登录集成到您的Rails应用中
ruby rails 框架指南 指导初学者了解ruby 及rail 框架,