如何提高 Ruby On Rails 性能

大家總是說 Rails 好慢啊,這差不多已經成爲 Ruby and Rails 社區裏的一個老生常談的問題了。然而實際上這個說法並不正確。只要正確使用 Rails,把你的應用運行速度提升 10 倍並不困難。那麼如何優化你的應用呢,我們來了解下面的內容。


Ruby on rails是一款性能非常強大的Web框架。不過在實際應用中我們還需要不斷的改進操作來幫助我們提高對Ruby on rails的高應用率。下面就來介紹一下Ruby on rails性能優化的技巧。

  詳細解讀Ruby哈希表相關概念 
  Ruby控制結構應用總結 
  Ruby nil概念詳解 
  Ruby實現stream具體方法介紹 
  幾種性能強大Ruby on Rails插件介紹

  目前在整個rails社區,都極少有運營rails大訪問量網站經驗的人詳細的談這個話題。至於國內,rails應用都停留在學習和嘗試階段,真正投入商業運營的基本找不到,所以談這個話題爲時太早,頗有對牛彈琴的感覺。所以權當是個人的總結性文章吧,也不會很詳細的展開談論,能對大家有所啓發就好。

  Ruby on 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物理內存是起碼的。

  Ruby on rails性能優化二、操作系統

  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性能好很多倍。

  Ruby on rails性能優化三、Web Server

  主流的選擇是apache2.2,lighttpd,litespeed。apache2.2可以首先排除,lighttpd和litespeed都不錯,但我會選擇開源免費的lighttpd。至於lighttpd的各種優化參數這裏不談。

  Ruby on rails性能優化四、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和內存資源的使用狀況。

  Ruby on rails性能優化五、應用程序

  1、避免使用component

  2、hash的key使用symbol

  3、對於ORM來說,數據庫的表設計的原則是顆粒度應該小一些,把常用字段和不常用字段儘量分離到不同表,嚴重影響性能的大字段分離到單獨的表

  4、在不使用對象緩存的情況下,查詢方法的:include可以預加載關聯對象,避免n+1問題

  Ruby on rails性能優化六、緩存

  1、rails的頁面緩存,Action緩存和片斷緩存

  rails提供的緩存方式可以有效降低對應用服務器的負載,但是緩存顆粒度太粗,適應範圍比較狹窄,緩存過期的處理比較煩瑣。

  2、對象緩存

  rails應用本身是可以水平擴展的,性能瓶頸往往還是數據庫訪問,使用CachedModel對象緩存可以有效降低數據庫負載,但CachedModel不像Hibernate二級緩存那麼強大,不能夠針對非主鍵查詢進行緩存讀取,不能針對非主鍵查詢進行緩存填充,和file-column有衝突,需要自行覆蓋model對象的save方法等等。另外在使用對象緩存的情況下,應該把查詢方法的:include去掉,避免關聯查詢無法利用緩存的現象。

  3、查詢緩存

  對於統計類耗時查詢,如果不要求實時性,那麼可以使用memcache-client將查詢結果緩存到memcached裏面。

  Ruby on rails性能優化七、Session的存儲方式

  由於Linux文件系統的高效性以及操作系統使用內存來做disk cache,因此默認使用硬盤文件保存session,並不會帶來性能瓶頸,使用memcached並不會提高多少IO性能。如果一定要優化session硬盤讀取,除了memcached,可以使用RAMDISK。


轉自:http://www.educity.cn/develop/1405238.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章