`
robbin
  • 浏览: 4821289 次
  • 性别: Icon_minigender_1
  • 来自: 上海
博客专栏
377a9ecd-1ea1-34ac-9530-9daa53bb2a7b
robbin谈管理
浏览量:137051
社区版块
存档分类
最新评论

ruby on rails应用性能优化之道

    博客分类:
  • Ruby
阅读更多
这是一篇我们运营JavaEye网站将近半年时间所得到经验的总结。目前在整个rails社区,都极少有运营rails大访问量网站经验的人详细的谈这个话题。至于国内,rails应用都停留在学习和尝试阶段,真正投入商业运营的基本找不到,所以谈这个话题为时太早,颇有对牛弹琴的感觉。所以权当是个人的总结性文章吧,也不会很详细的展开谈论,能对大家有所启发就好。

一、硬件

1、CPU
ruby解析器相对于JVM,PHP解析器来说,比较低效,可能会导致比较多的context switch,因此提高CPU和内存之间的总线带宽和传输速度会对ruby应用有比较大的性能提升。在目前主流的x86_64 CPU当中,AMD Opteron在CPU芯片内置内存控制器,可以有效提高CPU和内存数据交换速度,提高context switch能力。所以用AMD Opteron比Intel Xeon EM64T性能要好很多。

2、物理内存
ruby是以进程方式运行的,rails应用的并发响应能力主要取决于ruby进程的数量。一个最简单的rails应用,一个ruby进程占用的物理内存一般不过30-40MB,但是对于真正复杂的,而且数据库访问频繁,数据量大的rails应用来说,ruby进程稳定的物理内存占用至少100多MB,经常达到200多MB,甚至300MB。以开10个ruby进程计算,那么物理内存使用上限就是3GB,所以4GB物理内存是起码的。


二、操作系统

1、Linux distro
对于AMD x86_64的CPU来说,SLES要比RHEL有更多的优化。

2、32位版本还是64位版本
应该使用64位版本操作系统,以充分发挥x86_64 CPU的性能,并且x86_64的Linux很多Kernel参数也大很多,代价就是需要更多的物理内存。所以内存多多益善。

3、文件系统
rails会对每个浏览器会话在硬盘生成session文件,一个繁忙的网站,临时文件目录下面有上万乃至几万个session文件是很常见的现象。对于这种目录下面几万个小文件的存取,reiserfs要比ext3性能好很多倍。


三、Web Server

主流的选择是apache2.2,lighttpd,litespeed。apache2.2可以首先排除,lighttpd和litespeed都不错,但我会选择开源免费的lighttpd。至于lighttpd的各种优化参数这里不谈。


四、ruby的部署

1、ruby GC
可以使用railsbench提供的GC patch,以优化ruby内存使用,降低GC频率,提高throughput,代价就是ruby进程的物理内存占用加倍。所以物理内存越多越好,4G根本不够用,8G,16G绝对不嫌多。

2、FCGI还是mongrel
ruby进程可以以FCGI方式来运行,以FastCGI协议和Web Server通讯,也可以以HTTP Server方式来运行(即Mongrel),以HTTP协议和Web Server通讯,这两种方式性能上没有什么差异。FCGI方式,在单机上面通过Unix Socket和Web Server通讯,效率比走TCP Port要高。

3、开多少个ruby进程
ruby进程数量和web server的connection数量的比例没有定规,少了多了都会降低性能,要靠实践去摸索,也要参考CPU和内存资源的使用状况。


五、应用程序

1、避免使用component

2、hash的key使用symbol

3、对于ORM来说,数据库的表设计的原则是颗粒度应该小一些,把常用字段和不常用字段尽量分离到不同表,严重影响性能的大字段分离到单独的表

4、在不使用对象缓存的情况下,查询方法的:include可以预加载关联对象,避免n+1问题


六、缓存

1、rails的页面缓存,Action缓存和片断缓存
rails提供的缓存方式可以有效降低对应用服务器的负载,但是缓存颗粒度太粗,适应范围比较狭窄,缓存过期的处理比较烦琐。

2、对象缓存
rails应用本身是可以水平扩展的,性能瓶颈往往还是数据库访问,使用CachedModel对象缓存可以有效降低数据库负载,但CachedModel不像Hibernate二级缓存那么强大,不能够针对非主键查询进行缓存读取,不能针对非主键查询进行缓存填充,和file-column有冲突,需要自行覆盖model对象的save方法等等。另外在使用对象缓存的情况下,应该把查询方法的:include去掉,避免关联查询无法利用缓存的现象。

3、查询缓存
对于统计类耗时查询,如果不要求实时性,那么可以使用memcache-client将查询结果缓存到memcached里面。


七、Session的存储方式

由于Linux文件系统的高效性以及操作系统使用内存来做disk cache,因此默认使用硬盘文件保存session,并不会带来性能瓶颈,使用memcached并不会提高多少IO性能。如果一定要优化session硬盘读取,除了memcached,可以使用RAMDISK。
分享到:
评论
16 楼 lanhuai 2007-04-27  
lanhuai 写道
javaeye的论坛帖子做分表了吗?Rails上做分表好像没有先成的东西,我也在寻找解决方案。


为什么我的问题呢?
15 楼 lanhuai 2007-04-17  
javaeye的论坛帖子做分表了吗?Rails上做分表好像没有先成的东西,我也在寻找解决方案。
14 楼 whisper 2007-03-06  
现在用nginx
比lighty还要爽
13 楼 lcycenter 2007-02-07  
引用
由于Linux文件系统的高效性以及操作系统使用内存来做disk cache,因此默认使用硬盘文件保存session,并不会带来性能瓶颈,使用memcached并不会提高多少IO性能。如果一定要优化 session硬盘读取,除了memcached,可以使用RAMDISK。


使用硬盘文件/RAMDISK保存session, 怎么做到系统的scaling?
12 楼 robbin 2007-02-06  
capitain 写道
robbin 写道
gigix 写道
现在推荐的部署方案是HTTP Proxying了,FastCGI不太好用的说。


我还真不觉得HTTP Proxy方案好,而且lighttpd当前的版本的HTTP Proxy的balance能力很差。Apache2.2就不用提了。


robbin试用过最新的 lighttpd-1.5.0-r1605 没有, 我感觉配上mongrel 还不错


从lighttpd作者的博客来看,lighttpd1.5.0还在疯狂的添加各种新特性的试验过程中,不适合跑生产环境。当然等lighttpd1.5.0正式发布以后,性能会有一个飞跃。

前面我说过了,即使对于lighttpd1.5.0来说,FCGI和HTTP也没有多大区别,FCGI和HTTP Proxy都已经整合到一个module代码里面去了。由于lighttpd自己处理静态资源,对于FCGI和Mongrel来说,单纯处理动态资源两者没有什么性能区别。而且真要追究细节,FCGI在本机可以走Unix Socket,通讯效率还更高,此外HTTP Proxy走Mongrel还有一个编程上的麻烦,由于proxy过来,Mongrel拿到的来源IP就是lighttpd,不是真实的用户IP。

11 楼 capitain 2007-02-05  
robbin 写道
gigix 写道
现在推荐的部署方案是HTTP Proxying了,FastCGI不太好用的说。


我还真不觉得HTTP Proxy方案好,而且lighttpd当前的版本的HTTP Proxy的balance能力很差。Apache2.2就不用提了。


robbin试用过最新的 lighttpd-1.5.0-r1605 没有, 我感觉配上mongrel 还不错
10 楼 tsing 2007-02-05  
robbin 对比过nginx和lightty否?
9 楼 Jan 2007-02-05  
对于大量小文件的存取,xfs可能会有更好的性能,不知道javaeye有没有做过对比。

要调整性能可以试试ruby自带的benchmark和profile库
8 楼 rsu 2007-02-04  
robin果然是国内ror的前辈,我目前也正打算用ror开发一些大流量的网站,由于以前一直用mac,win下就用.net,现在需要改用linux来部署(XServe……买不起),所以希望可以和你多多交流经验,不只你有gtalk或msn否?
7 楼 javafifth 2007-02-02  
我在准备用 Rails 开发一个网站,编程也差不多了,但从没有布暑的经验。我在找一些资料来帮助自己,而你的二篇有关此方面的文章,让我受益不浅,感谢你写的东西。
有问题的话我会多向你请教,还请你到时不吝指教一,二。
6 楼 robbin 2007-02-02  
gigix 写道
现在推荐的部署方案是HTTP Proxying了,FastCGI不太好用的说。


我还真不觉得HTTP Proxy方案好,而且lighttpd当前的版本的HTTP Proxy的balance能力很差。Apache2.2就不用提了。
5 楼 robbin 2007-02-02  
DigitalSonic 写道
看了老大的这篇文章大概有些数目了,我朋友做个rails的站点,服务器的配置没有javaeye的高,但pageview的量也不大,可是总觉得性能没上去,他希望我帮他调优,不过我对rails的调优没什么经验,但感觉他是配置不当造成的,具体情况我还没看过,不知道大概应该用些什么工具监控哪些东西呢?当然是开源的就最好了,呵呵。


ps, top, vmstat, iostat
4 楼 gigix 2007-02-02  
现在推荐的部署方案是HTTP Proxying了,FastCGI不太好用的说。
3 楼 DigitalSonic 2007-02-02  
看了老大的这篇文章大概有些数目了,我朋友做个rails的站点,服务器的配置没有javaeye的高,但pageview的量也不大,可是总觉得性能没上去,他希望我帮他调优,不过我对rails的调优没什么经验,但感觉他是配置不当造成的,具体情况我还没看过,不知道大概应该用些什么工具监控哪些东西呢?当然是开源的就最好了,呵呵。
2 楼 ouspec 2007-02-01  
lanhuai 写道
javaeye现在的服务器是什么配置呢?


搜索以前robbin的帖子里面有。
1 楼 lanhuai 2007-02-01  
javaeye现在的服务器是什么配置呢?

相关推荐

    ruby on rails 101

    - **部署、安全与性能**:讲解如何部署Ruby on Rails应用、实施安全措施以及优化性能。 #### 结语 通过这五天的课程,读者不仅能够系统地学习Ruby on Rails的核心概念和技术,还能了解到一些高级主题。无论是初学者...

    ruby on rails最新版

    Ruby on Rails,简称Rails,是基于Ruby编程语言的一个开源Web应用程序框架,它遵循MVC(模型-视图-控制器)架构模式,旨在提高开发效率和代码的可读性。Rails以其“约定优于配置”(Convention over Configuration)...

    Ruby on Rails入门权威经典

    对于更高级的主题,例如部署到服务器、性能优化、安全性和API开发,本书也会提供基础的引导,帮助读者了解实际生产环境下的Rails应用运维。 总的来说,《Ruby on Rails入门权威经典》是一本内容丰富、实践性强的...

    ruby on rails在线考试系统

    10. 性能优化:Rails应用可以通过缓存、数据库索引、数据库连接池、延迟加载等技术提升性能。在线考试系统可能会大量使用缓存来减少数据库查询,提高响应速度。 以上是关于“ruby on rails在线考试系统”的主要知识...

    举例理解Ruby on Rails的页面缓存机制

    总的来说,Ruby on Rails 的页面缓存机制是提高 web 应用性能的有效手段,但需要开发者根据实际需求灵活选择和实施。通过了解页面缓存的原理和实践,可以更好地优化 Rails 应用的性能,为用户提供更快的加载速度和更...

    ruby on rails 书全集(10余本经典著作PDF版)

    进阶篇则会涉及更复杂的主题,如性能优化、测试驱动开发(TDD)和行为驱动开发(BDD)。Rails鼓励开发者使用测试来确保代码质量,因此,Rspec和Capybara等测试工具的使用方法是重要的一环。另外,书中可能会讲解如何进行...

    ruby on rails 开发环境包(ruby1.8.7,rails2.2.3)

    Ruby on Rails,简称Rails,是由David Heinemeier Hansson创建的一种基于Ruby语言的开源Web应用程序框架,它遵循MVC(模型-视图-控制器)架构模式,旨在提高开发效率和可读性。在这个开发环境包中,我们拥有Ruby ...

    对优化Ruby on Rails性能的一些办法的探究

    本文将深入探讨几种优化Rails应用性能的方法,特别是针对内存管理和垃圾回收(Garbage Collection, GC)等问题。 #### 导致Rails应用变慢的原因 通常来说,Rails应用变慢的原因可以归结为两大类: 1. **错误地选择...

    Wrox - Beginning Ruby on Rails

    - **Rails入门**:讲解如何安装配置Ruby on Rails环境,以及创建第一个Rails应用的过程。 - **数据库交互**:教授如何在Rails应用中使用ActiveRecord来操作数据库。 - **控制器与视图**:介绍Rails中的控制器和视图...

    Ruby on Rails 3 Tutorial

    - **《Ruby on Rails 3 教程》**:由Michael Hartl编写的一本经典教材,被广泛认为是学习Rails的最佳资源之一。 - **教学方法**: - **示例驱动**:通过具体的项目示例来讲解Rails的各种功能。 - **循序渐进**:从...

    Ruby On Rails傻瓜书

    - **部署**:讨论如何将Rails应用部署到生产环境中,包括选择合适的云服务提供商。 - **性能优化**:提供一些实用技巧提高应用的响应速度和效率。 #### 三、学习方法建议 - **实践为主**:通过实际编码来加深对概念...

    Ruby on Rails Enterprise Application Development.pdf

    《Ruby on Rails Enterprise Application Development》是一本专注于Ruby on Rails框架的书籍,主要讲述了如何利用Ruby on Rails开发企业级应用程序。本书作者是Elliot Smith和Rob Nichols,他们在IT行业有着丰富的...

    wrox Professional Ruby on Rails_code.zip

    此外,这些示例代码还能帮助开发者学习如何优化Rails应用,包括性能调优、错误处理和安全实践。 总之,《Ruby on Rails专业指南》是一本适合初学者和有经验的开发者的书籍,它全面覆盖了Ruby on Rails的各个方面,...

    Ruby on Rails 入门经典教程

    通过《Ruby on Rails 入门经典教程》,无论你是编程新手还是希望转行Web开发的计算机操作者,都可以系统地掌握Ruby on Rails的核心知识,开启Web开发之旅。aybook.cn_rinumzwb1227.pdf这份文档正是这个宝贵资源的...

    基于Ruby语言的Ruby on Rails项目及其代码方案

    - **性能优化**:可以采用缓存机制来提高应用性能。 - **错误处理**:实现异常处理逻辑,提升用户体验。 - **测试**:编写单元测试和集成测试,确保代码质量。 #### 六、总结 本项目展示了如何使用Ruby on Rails...

    Ruby on Rails源代码

    了解如何配置和管理gem可以帮助你优化应用性能和稳定性。 8. **配置**:Rails应用的配置信息位于`config`目录下,如`application.rb`和`environment.rb`。源代码揭示了如何根据环境(开发、测试、生产)调整应用...

    ruby_on_rails 源代码上

    Ruby on Rails,简称Rails,是基于Ruby...以上只是Ruby on Rails的部分基础知识,实际开发中还会涉及到更多如缓存、部署、安全性、性能优化等方面的知识。通过深入学习和实践,你可以更好地掌握这个强大的Web开发框架。

    Ruby on Rails实例开发

    在Rails应用中,视图(View)部分通常包含HTML和CSS代码,通过 erb(Embedded Ruby)模板引擎,可以将Ruby代码嵌入到HTML中,实现动态内容的生成。 在实例开发过程中,我们可能首先会设置一个新的Rails项目,通过`...

    ruby on rails 搭建redmine

    Ruby on Rails 是一个基于Ruby语言的开源Web应用框架,它遵循MVC(Model-View-Controller)架构模式,用于快速开发高效、优雅的web应用程序。Redmine则是一个用Ruby on Rails构建的项目管理软件,提供了任务跟踪、...

Global site tag (gtag.js) - Google Analytics