rubyonrails:ruby on rails应用性能优化的道

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

  、硬件

  1、CPU

  ruby解析器相对于JVMPHP解析器来说比较低效可能会导致比较多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物理内存是起码

   2、操作系统

  1、Linux distro

  对于AMD x86_64CPU来说SLES要比RHEL有更多优化

  2、32位版本还是64位版本

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

  3、文件系统

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

   3、Web Server

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

   4、ruby部署

  1、ruby GC

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

  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 serverconnection数量比例没有定规少了多了都会降低性能要靠实战去摸索也要参考CPU和内存资源使用状况

   5、应用

  1、避免使用component

  2、hashkey使用symbol

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

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

   6、缓存Cache

  1、rails页面缓存CacheAction缓存Cache和片断缓存Cache

  rails提供缓存Cache方式可以有效降低对应用服务器负载但是缓存Cache颗粒度太粗适应范围比较狭窄缓存Cache过期处理比较烦琐

  2、对象缓存Cache

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

  3、查询缓存Cache

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

   7、Session存储方式

  由于Linux文件系统高效性以及操作系统使用内存来做disk cache因此默认使用硬盘文件保存session并不会带来性能瓶颈使用memcached并不会提高多少IO性能如果定要优化session硬盘读取除了memcached可以使用RAMDISK

Tags:  rubyonrails安装 rubyonrails教程 rubyrails rubyonrails

延伸阅读

最新评论

发表评论