Ruby on rails性能優(yōu)化經(jīng)驗分享
Ruby on rails是一款性能非常強大的Web框架。不過在實際應(yīng)用中我們還需要不斷的改進操作來幫助我們提高對Ruby on rails的高應(yīng)用率。下面就來介紹一下Ruby on rails性能優(yōu)化的技巧。#t#
目前在整個rails社區(qū),都極少有運營rails大訪問量網(wǎng)站經(jīng)驗的人詳細的談這個話題。至于國內(nèi),rails應(yīng)用都停留在學(xué)習(xí)和嘗試階段,真正投入商業(yè)運營的基本找不到,所以談這個話題為時太早,頗有對牛彈琴的感覺。所以權(quán)當是個人的總結(jié)性文章吧,也不會很詳細的展開談?wù)?,能對大家有所啟發(fā)就好。
Ruby on rails性能優(yōu)化一、硬件
1、CPU
ruby解析器相對于JVM,PHP解析器來說,比較低效,可能會導(dǎo)致比較多的context switch,因此提高CPU和內(nèi)存之間的總線帶寬和傳輸速度會對ruby應(yīng)用有比較大的性能提升。在目前主流的x86_64 CPU當中,AMD Opteron在CPU芯片內(nèi)置內(nèi)存控制器,可以有效提高CPU和內(nèi)存數(shù)據(jù)交換速度,提高context switch能力。所以用AMD Opteron比Intel Xeon EM64T性能要好很多。
2、物理內(nèi)存
ruby是以進程方式運行的,rails應(yīng)用的并發(fā)響應(yīng)能力主要取決于ruby進程的數(shù)量。一個最簡單的rails應(yīng)用,一個ruby進程占用的物理內(nèi)存一般不過30-40MB,但是對于真正復(fù)雜的,而且數(shù)據(jù)庫訪問頻繁,數(shù)據(jù)量大的rails應(yīng)用來說,ruby進程穩(wěn)定的物理內(nèi)存占用至少100多MB,經(jīng)常達到200多MB,甚至300MB。以開10個ruby進程計算,那么物理內(nèi)存使用上限就是3GB,所以4GB物理內(nèi)存是起碼的。
Ruby on rails性能優(yōu)化二、操作系統(tǒng)
1、Linux distro
對于AMD x86_64的CPU來說,SLES要比RHEL有更多的優(yōu)化。
2、32位版本還是64位版本
應(yīng)該使用64位版本操作系統(tǒng),以充分發(fā)揮x86_64 CPU的性能,并且x86_64的Linux很多Kernel參數(shù)也大很多,代價就是需要更多的物理內(nèi)存。所以內(nèi)存多多益善。
3、文件系統(tǒng)
rails會對每個瀏覽器會話在硬盤生成session文件,一個繁忙的網(wǎng)站,臨時文件目錄下面有上萬乃至幾萬個session文件是很常見的現(xiàn)象。對于這種目錄下面幾萬個小文件的存取,reiserfs要比ext3性能好很多倍。
Ruby on rails性能優(yōu)化三、Web Server
主流的選擇是apache2.2,lighttpd,litespeed。apache2.2可以首先排除,lighttpd和litespeed都不錯,但我會選擇開源免費的lighttpd。至于lighttpd的各種優(yōu)化參數(shù)這里不談。
Ruby on rails性能優(yōu)化四、ruby的部署
1、ruby GC
可以使用railsbench提供的GC patch,以優(yōu)化ruby內(nèi)存使用,降低GC頻率,提高throughput,代價就是ruby進程的物理內(nèi)存占用加倍。所以物理內(nèi)存越多越好,4G根本不夠用,8G,16G絕對不嫌多。
2、FCGI還是mongrel
ruby進程可以以FCGI方式來運行,以FastCGI協(xié)議和Web Server通訊,也可以以HTTP Server方式來運行(即Mongrel),以HTTP協(xié)議和Web Server通訊,這兩種方式性能上沒有什么差異。FCGI方式,在單機上面通過Unix Socket和Web Server通訊,效率比走TCP Port要高。
3、開多少個ruby進程
ruby進程數(shù)量和web server的connection數(shù)量的比例沒有定規(guī),少了多了都會降低性能,要靠實踐去摸索,也要參考CPU和內(nèi)存資源的使用狀況。
Ruby on rails性能優(yōu)化五、應(yīng)用程序
1、避免使用component
2、hash的key使用symbol
3、對于ORM來說,數(shù)據(jù)庫的表設(shè)計的原則是顆粒度應(yīng)該小一些,把常用字段和不常用字段盡量分離到不同表,嚴重影響性能的大字段分離到單獨的表
4、在不使用對象緩存的情況下,查詢方法的:include可以預(yù)加載關(guān)聯(lián)對象,避免n+1問題
Ruby on rails性能優(yōu)化六、緩存
1、rails的頁面緩存,Action緩存和片斷緩存
rails提供的緩存方式可以有效降低對應(yīng)用服務(wù)器的負載,但是緩存顆粒度太粗,適應(yīng)范圍比較狹窄,緩存過期的處理比較煩瑣。
2、對象緩存
rails應(yīng)用本身是可以水平擴展的,性能瓶頸往往還是數(shù)據(jù)庫訪問,使用CachedModel對象緩存可以有效降低數(shù)據(jù)庫負載,但CachedModel不像Hibernate二級緩存那么強大,不能夠針對非主鍵查詢進行緩存讀取,不能針對非主鍵查詢進行緩存填充,和file-column有沖突,需要自行覆蓋model對象的save方法等等。另外在使用對象緩存的情況下,應(yīng)該把查詢方法的:include去掉,避免關(guān)聯(lián)查詢無法利用緩存的現(xiàn)象。
3、查詢緩存
對于統(tǒng)計類耗時查詢,如果不要求實時性,那么可以使用memcache-client將查詢結(jié)果緩存到memcached里面。
Ruby on rails性能優(yōu)化七、Session的存儲方式
由于Linux文件系統(tǒng)的高效性以及操作系統(tǒng)使用內(nèi)存來做disk cache,因此默認使用硬盤文件保存session,并不會帶來性能瓶頸,使用memcached并不會提高多少IO性能。如果一定要優(yōu)化session硬盤讀取,除了memcached,可以使用RAMDISK。