、硬件
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
最新评论