免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3909 | 回复: 5
打印 上一主题 下一主题

Ruby on Rails性能优化七剑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-12-08 13:44 |只看该作者 |倒序浏览
Ruby on Rails性能优化七剑



Ruby on Rails(也叫做Rails)是一个针对支持数据库的Internet应用程序的Ruby框架,在51CTO之前报道的文章《进入Ruby on Rails世界》与《Ruby on Rails的核心特性是什么?》里,都对其作了详细的介绍,这里将不做过多的说明,文章的主旨在于如何做好Ruby on Rails的性能优化。


目前在整个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

主流的选择是Apache 2.2,lighttpd,litespeed。Apache 2.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。

论坛徽章:
0
2 [报告]
发表于 2010-12-08 15:11 |只看该作者
rails应用及优化,robbin写过一系列文档,那真是精华,每个rails程序员都应该好好看看。

论坛徽章:
0
3 [报告]
发表于 2010-12-08 15:35 |只看该作者
硬件、内存、操作系统等方面,是放至四海皆准的内容,共性的东西,没啥好谈的。

论坛徽章:
0
4 [报告]
发表于 2010-12-08 16:47 |只看该作者
回复 3# 2gua


    抽时间指点 指点!

论坛徽章:
0
5 [报告]
发表于 2010-12-08 16:50 |只看该作者
回复 4# 中关村村草


    高性能Rails,可以参考Ruby Enterprise:http://www.rubyenterpriseedition.com/

论坛徽章:
0
6 [报告]
发表于 2010-12-08 16:55 |只看该作者
回复 5# 2gua


    OK  以后多往这方面看看!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP