锁定老帖子 主题:ruby on rails应用性能优化之道
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2007-02-01
一、硬件 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。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-02-01
javaeye现在的服务器是什么配置呢?
|
|
返回顶楼 | |
发表时间:2007-02-01
lanhuai 写道 javaeye现在的服务器是什么配置呢?
搜索以前robbin的帖子里面有。 |
|
返回顶楼 | |
发表时间:2007-02-02
看了老大的这篇文章大概有些数目了,我朋友做个rails的站点,服务器的配置没有javaeye的高,但pageview的量也不大,可是总觉得性能没上去,他希望我帮他调优,不过我对rails的调优没什么经验,但感觉他是配置不当造成的,具体情况我还没看过,不知道大概应该用些什么工具监控哪些东西呢?当然是开源的就最好了,呵呵。
|
|
返回顶楼 | |
发表时间:2007-02-02
现在推荐的部署方案是HTTP Proxying了,FastCGI不太好用的说。
|
|
返回顶楼 | |
发表时间:2007-02-02
DigitalSonic 写道 看了老大的这篇文章大概有些数目了,我朋友做个rails的站点,服务器的配置没有javaeye的高,但pageview的量也不大,可是总觉得性能没上去,他希望我帮他调优,不过我对rails的调优没什么经验,但感觉他是配置不当造成的,具体情况我还没看过,不知道大概应该用些什么工具监控哪些东西呢?当然是开源的就最好了,呵呵。
ps, top, vmstat, iostat |
|
返回顶楼 | |
发表时间:2007-02-02
gigix 写道 现在推荐的部署方案是HTTP Proxying了,FastCGI不太好用的说。
我还真不觉得HTTP Proxy方案好,而且lighttpd当前的版本的HTTP Proxy的balance能力很差。Apache2.2就不用提了。 |
|
返回顶楼 | |
发表时间:2007-02-02
我在准备用 Rails 开发一个网站,编程也差不多了,但从没有布暑的经验。我在找一些资料来帮助自己,而你的二篇有关此方面的文章,让我受益不浅,感谢你写的东西。
有问题的话我会多向你请教,还请你到时不吝指教一,二。 |
|
返回顶楼 | |
发表时间:2007-02-04
robin果然是国内ror的前辈,我目前也正打算用ror开发一些大流量的网站,由于以前一直用mac,win下就用.net,现在需要改用linux来部署(XServe……买不起),所以希望可以和你多多交流经验,不只你有gtalk或msn否?
|
|
返回顶楼 | |
发表时间:2007-02-05
对于大量小文件的存取,xfs可能会有更好的性能,不知道javaeye有没有做过对比。
要调整性能可以试试ruby自带的benchmark和profile库 |
|
返回顶楼 | |